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语句

  • 如果我将checkSolution.interrupt()和“惊人的工作”方法调用移动到标记为
    //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
    。正在更改。感谢文章指针。奇怪的是,我今天才发现!刚刚限制了异常以简化论坛中发布的代码。感谢文章指针。奇怪的是,我今天才发现!只是为了简化论坛中发布的代码而限制了异常。