Java 仅当其他线程从队列中拉出时,状态线程才会报告
Im使用一个LinkedBlockingQueue,由几个工作线程和一个状态报告线程共享 status reporter线程每30秒报告队列中剩余的项目数:Java 仅当其他线程从队列中拉出时,状态线程才会报告,java,multithreading,Java,Multithreading,Im使用一个LinkedBlockingQueue,由几个工作线程和一个状态报告线程共享 status reporter线程每30秒报告队列中剩余的项目数: while(!queue.isEmpty()){ try { float completion = (queue.size() * 1.0f) / this.queueSize; System.out.println(this.jobeName+" :
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();
}
}
有没有办法让状态线程仅在工作线程从队列中拉出时报告?更简单的解决方案是让
工作线程在从队列中拉出任务后直接调用状态线程上的方法。使用此statusThread
将只是一个对象,不需要作为单独的线程运行
但是,如果您希望使用这种通过线程管理通知机制,则可以这样做,但肯定不会像上述解决方案那样简单,也不会有更多的同步开销
方法可以是:
我们可以使用等待
和通知
机制
状态线程将持续等待对象A
监视器。每当它从worker threads
收到notify
调用时,它就会打印统计数据。(注意,我们需要注意这里的伪尾流场景)
另一方面,工作线程
在从队列中拾取任务时将获得对象B上的锁,拾取任务后将调用对象a上的通知
方法(通过获取对象a上的锁)最后释放对象B上的锁,以便下一个工作线程
从队列中提取任务。您的意思是,当工作线程从队列中拉出时,您希望状态线程报告,而不是等待30秒?您可以检查此数字何时更改,并仅在更改时打印它。@PeterLawrey可能存在一种情况,即一个线程被拉出,另一个线程被推入,大小将保持不变。@SashaSalauyou这是可能的,但除非长度为零,大多数情况下应为零。注意:队列长度不包括任何实际运行的作业。@MadhusudanaReddySunnapu完全正确!