我正在使用LinkedBlockingQueue,由多个工作线程和1个状态报告者线程共享。
状态报告者线程每隔30秒报告队列中剩余的项目数:
while(!queue.isEmpty()){
try {
float completion = (queue.size() * 1.0f) / this.queueSize;
System.out.println(this.jobeName+" : "+this.conferenceYear+ " remaining..."+MessageFormat.format("{0,number,#.##%}",completion));
TimeUnit.SECONDS.sleep(30);;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
有没有办法让状态线程只在工作线程从队列中拉出来时报告?
答案 0 :(得分:0)
更简单的解决方案是让worker threads
在从队列中拉出任务后直接调用statusThread
上的方法。使用此statusThread
只是一个对象,不需要作为单独的线程运行。
但是,如果您希望通过线程通知机制进行管理,则可以完成,但绝对不会比上面的解决方案更简单,并且会产生更多的同步开销。
方法可能是 -
我们可以使用wait
和notify
机制。
Status thread
将wait
object A
监控。每当它从notify
调用worker threads
时,它就会打印统计信息。 (注意,我们需要在这里处理虚假的唤醒场景。)
另一方面,Worker threads
从队列中选择任务时会获得object B
上的锁定,并且在获取任务后会调用notify
上的object A
方法(通过获取object A
上的锁定)并最终释放object B
上的锁定,以便下一个worker thread
从队列中获取任务。