1 回答
TA贡献1827条经验 获得超9个赞
有很多方法可以解决这个问题,但我建议BlockingQueue
在工作线程和任何其他可以发出信号以执行其任务的线程之间使用共享。worker 的任务被设置在一个循环中,在循环的顶部它尝试take()
从队列中获取一个对象。这将阻塞,直到某个其他线程将一个对象排入队列,该对象构成了信号。
这种方法的一些优点包括:
您可以轻松自然地一次将多个信号排队,这样如果在发布信号时工作人员实际上正在工作,则该信号不会丢失;
您可以通过入队对象向工作人员传达信息,例如任务参数或退出信号而不是执行任何任务;
您有一个内置选项可以在接收信号时使用超时;和
所有
BlockingQueue
实现都是线程安全的,因此您无需担心实现自己的同步。
示例:
public OnDemandTask implements Runnable {
private final BlockingQueue<?> signalQueue;
public FeedbackTask(BlockingQueue<?> signalQueue) {
this.signalQueue = signalQueue;
}
@Override
public void run() {
try {
while (true) {
// blocks until an object becomes available from the queue
// may throw InterruptedException
signalQueue.take();
performTask();
}
} catch (InterruptedException ie) {
// we've broken out of the loop; nothing further to do
}
}
private performTask() {
// ...
}
}
添加回答
举报