Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 仅当其他线程从队列中拉出时,状态线程才会报告_Java_Multithreading - Fatal编程技术网

Java 仅当其他线程从队列中拉出时,状态线程才会报告

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+" :

Im使用一个LinkedBlockingQueue,由几个工作线程和一个状态报告线程共享

status reporter线程每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();
            }
        }

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

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

但是,如果您希望使用这种通过线程管理通知机制,则可以这样做,但肯定不会像上述解决方案那样简单,也不会有更多的同步开销

方法可以是:

我们可以使用
等待
通知
机制

状态线程将持续
等待
对象A
监视器。每当它从
worker threads
收到
notify
调用时,它就会打印统计数据。(注意,我们需要注意这里的伪尾流场景)


另一方面,
工作线程
在从队列中拾取任务时将获得对象B上的锁,拾取任务后将调用对象a上的
通知
方法(通过获取对象a上的锁)最后释放
对象B上的锁,以便下一个
工作线程
从队列中提取任务。

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