我想暂停通过迭代消息列表在文件中写消息的线程。当消息列表为空时,我希望线程停止,并在列表中的消息时恢复线程。
我知道停止,暂停(),恢复方法已被弃用,但如果线程持续在后台,它会消耗cpu。我做了很多谷歌搜索,但找不到合适的答案。请任何人帮助我
这是我的代码:
private Thread mFileWriterThread = new Thread() {
@Override
public synchronized void run() {
while (mIsRunning) {
synchronized (mMessageList) {
Iterator it = mMessageList.iterator();
while ((it.hasNext())) {
String message = (String) it.next();
writeToFile(fileOutputStream, message);
mMessageList.remove(message);
}
}
}
}
};
答案 0 :(得分:3)
这就是BlockingQueue的存在。它有一个take()方法,强制一个线程阻塞,直到一个Object可用。您的问题可以通过简单的生产者 - 消费者设计来解决。
我在这里粘贴了一个取自Oracle示例的最小片段:
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... handle ...}
}
Object produce() { ... }
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... handle ...}
}
void consume(Object x) { ... }
}
当然,Consumer和Producer必须以某种方式共享队列(只是将它传递给构造函数,如示例中所示)。
答案 1 :(得分:0)
您想使用wait()来创建线程块*。然后调用notify()再次唤醒线程。谷歌的“java等待通知”会给你一个教程。
*阻止此处意味着在不使用任何资源的情况下等待,直到另一个线程将其唤醒。