Java 在使用者线程收到同步更改通知并退出后,处理生产者线程的正确方法是什么?
我的理解是,在消费者收到同步变量更改的通知后,如果消费者Java 在使用者线程收到同步更改通知并退出后,处理生产者线程的正确方法是什么?,java,concurrency,producer-consumer,Java,Concurrency,Producer Consumer,我的理解是,在消费者收到同步变量更改的通知后,如果消费者线程掉出来并退出,没有任何东西可以阻止生产者继续工作。处理生产者线程的正确方法是什么?是否有任何东西阻止从conumser的run()方法调用Thread.interrupt() 我正在努力做到以下几点: //in consumer public void run() { synchronized( checkSolution) { while (!checkSolution.getIsSolutionValid)
线程
掉出来并退出,没有任何东西可以阻止生产者继续工作。处理生产者线程的正确方法是什么?是否有任何东西阻止从conumser的run()
方法调用Thread.interrupt()
我正在努力做到以下几点:
//in consumer
public void run() {
synchronized( checkSolution) {
while (!checkSolution.getIsSolutionValid) {
try{
checkSolution.wait()
} catch( InterruptedException ignore) {}
}
//valid soln received
System.out.println("reference");
checkSolution.interrupt();
doAmazingWorkWithSolution();
}
//MARK
}
//in producer (checkSolution)
public synchronized boolean getIsSolutionValid() { return isSolutionValid; }
public void run() {
while(true) {
try{
synchronized( this) {
if( fSolution.size() != correctSize) {
isSolutionValid = false;
Thread.sleep(500);
} else {
System.out.println(" Solution is correct size.");
isSolutionValid = true;
notifyAll();
}
}
} catch(InterruptedException ie) {
//Thread.currentThread().interrupt();
return;
}
}
}
下面是我注意到的,我真的不明白:
else
块中的代码。如何避免在通知期间滥发if/else语句
//MARK
的行,它中断的速度会明显变慢,执行惊人的工作调用,但奇怪的是,它从不打印`println(“引用”)InterruptedException
中删除return语句,它将接收中断,并在Exception
块中结束一步,但将else语句垃圾处理数百万次,然后开始重新插入线程。sleep
块,就好像中断标志已被重置一样Thread.currentThread().interrupt()代码>在制作人的中断异常中
是我在其他人的代码中看到的东西,但如果我包含它或不包含它,它似乎没有任何作用
这些都是我感到困惑的小事。主要的问题是如何在消费者得到其所需后,尽可能有效地关闭生产商,使其尽可能靠近消费者线程。我认为您的工作水平太低了。如果只有一个生产者和消费者,则可以使用
java.util.concurrent.SynchronousQueue
阻止消费者,直到生产者完成其工作
有关Thread.currentThread().interrupt()
,请参阅。这样做是个坏主意
catch( InterruptedException ignore) {}
在
while
循环中。更多详情请参阅链接文章。我认为您的工作水平太低了。如果只有一个生产者和消费者,则可以使用java.util.concurrent.SynchronousQueue
阻止消费者,直到生产者完成其工作
有关Thread.currentThread().interrupt()
,请参阅。这样做是个坏主意
catch( InterruptedException ignore) {}
在
while
循环中。更多详细信息请参见链接文章。如何声明isValidSolution
?Volatile?@assylias,isSolutionValid是producer类的一个私有布尔实例变量,并且…我在中输入了!IsSolution对消费者的条件有效,而不是!checkSolution.getIsSolutionValid
。正在更改。isValidSolution
如何声明?Volatile?@assylias,isSolutionValid是producer类的一个私有布尔实例变量,并且…我在中输入了!IsSolution对消费者的条件有效,而不是!checkSolution.getIsSolutionValid
。正在更改。感谢文章指针。奇怪的是,我今天才发现!刚刚限制了异常以简化论坛中发布的代码。感谢文章指针。奇怪的是,我今天才发现!只是为了简化论坛中发布的代码而限制了异常。