【问题标题】:Status Thread only report when other threads pull from Queue状态线程仅在其他线程从队列中拉出时报告
【发布时间】:2016-03-28 15:17:53
【问题描述】:

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

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

【问题讨论】:

  • 您的意思是,当工作线程从队列中拉出时,您希望状态线程报告而不是等待 30 秒?
  • 您可以检查此号码何时更改,仅在更改时打印。
  • @PeterLawrey 可能会出现一个线程被拉另一个线程被推动的情况——大小将保持不变。
  • @SashaSalauyou 这是可能的,但除非长度为零,否则它应该是大多数时间。注意:队列长度不包括任何实际运行的作业。
  • @MadhusudanaReddySunnapu 完全正确!

标签: java multithreading


【解决方案1】:

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

但是,如果您希望通过线程通知机制进行管理,则可以做到,但绝对不是比上述更简单的解决方案和更多的同步开销。

方法可能是 -

我们可以使用waitnotify 机制。

Status thread 将在object A 监视器上持续wait。每当它收到来自worker threadsnotify 呼叫时,它就会打印统计信息。 (请注意,我们需要在这里处理虚假的唤醒场景)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 2012-08-06
    • 2013-01-03
    相关资源
    最近更新 更多