状态线程仅在其他线程从队列中拉出时报告

时间:2016-03-28 15:17:53

标签: java multithreading

我正在使用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();
            }
        }

有没有办法让状态线程只在工作线程从队列中拉出来时报告?

1 个答案:

答案 0 :(得分:0)

更简单的解决方案是让worker threads在从队列中拉出任务后直接调用statusThread上的方法。使用此statusThread只是一个对象,不需要作为单独的线程运行。

但是,如果您希望通过线程通知机制进行管理,则可以完成,但绝对不会比上面的解决方案更简单,并且会产生更多的同步开销。

方法可能是 -

我们可以使用waitnotify机制。

Status threadwait object A监控。每当它从notify调用worker threads时,它就会打印统计信息。 (注意,我们需要在这里处理虚假的唤醒场景。)

另一方面,Worker threads从队列中选择任务时会获得object B上的锁定,并且在获取任务后会调用notify上的object A方法(通过获取object A上的锁定)并最终释放object B上的锁定,以便下一个worker thread从队列中获取任务。