我有一个必须等待来自不同线程的多个对象的线程。
@Override
public void run() {
while (true) {
for (BackgroundTask task : tasks) {
synchronized (task) {
if (task.isReady()) {
task.doTask();
}
}
}
}
}
但这是对CPU时间的愚蠢使用。 如何等待几个物体?
答案 0 :(得分:3)
IMO CountDownLatch将是一个很好的方式来实现它。引自Javadoc:
class Driver2 { // ...
void main() throws InterruptedException {
CountDownLatch doneSignal = new CountDownLatch(N);
Executor e = ...
for (int i = 0; i < N; ++i) // create and start threads
e.execute(new WorkerRunnable(doneSignal, i));
doneSignal.await(); // wait for all to finish
}
}
class WorkerRunnable implements Runnable {
private final CountDownLatch doneSignal;
private final int i;
WorkerRunnable(CountDownLatch doneSignal, int i) {
this.doneSignal = doneSignal;
this.i = i;
}
public void run() {
try {
doWork(i);
doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
}
void doWork() { ... }
}
答案 1 :(得分:1)
如果您可以修改BackgroundTask
课程,请在准备好后通知您的跑步者。向您的运行程序类添加一个队列,每次任务准备就绪时,它都可以将自己添加到队列并通知它。
当队列为空时,它会在队列上等待,并在不存在时将项目拉出来运行。
答案 2 :(得分:1)
请使用notifyaAll()
而不是notify()
,因为notify会唤醒单个线程,而notifyAll()会唤醒所有等待的线程。
答案 3 :(得分:0)
您可以在Object上使用notify()
和wait()
。你如何使用它取决于程序的结构。