在方法调用之前中断阻塞方法

cro*_*raf 2 java multithreading interrupt race-condition

我正在读这本书,(O'Reillys Java Threads 3rd ed.,现在有非常糟糕的解释),我遇到过这段代码:

//in RandomCharacterGenerator class
public void run( ) {
    while (!isInterrupted()) {
            nextCharacter( );
            try {

                Thread.sleep(getPauseTime( ));

            } catch (InterruptedException ie) {
                return;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

以下解释(生成器是主线程中上层类的实例):

producer.interrupt( );
Run Code Online (Sandbox Code Playgroud)

如果主线程在RandomCharacterGenerator线程处于休眠状态时执行此语句,则RandomCharacterGenerator线程将获取中断的异常并立即从run()方法返回.否则,当字符输入线程接下来到达其循环的顶部时,它会看到已设置中断标志并从其run()方法返回.无论哪种方式,随机字符生成器线程完成其任务.

请注意,此技术并不能完全消除在线程被要求停止后我们睡眠一段时间的可能性.在RandomCharacterGenerator调用isInterrupted()方法之后,主线程可以调用interrupt()方法.字符读取线程仍然执行sleep()方法,该方法不会被中断(因为主线程已经完成了interrupt()方法).这是我们在下一章中解决的竞争条件的另一个例子.由于这种情况下的竞争条件是良性的(这只意味着我们再睡一次比我们想要的时间),这对我们的目的来说已经足够了.

第二段对我来说完全不清楚.我的第一个问题是:我们怎么能再睡一个周期?如果我们在睡觉时中断线程就会失去运行,如果我们在睡眠前中断它会在睡眠开始时中断睡眠(我测试过,我认为这是真的吗?我是对的),如果我们在睡觉后打断它会制动回路.

第二个问题:在这个例子中(这是书中的整个代码)是完全没必要的检查循环,并且它可以在(真实)具有相同结果的情况下站立,因此关于循环顶部的第一段是完全废话?

JB *_*zet 9

这本书错了.在线程休眠之前中断线程将使sleep()方法立即抛出InterruptedException.

引用Java并发实践:

考虑中断的一个好方法是它实际上不会中断正在运行的线程; 它只是请求线程在下一个方便的机会中断自己.(这些机会被称为取消点.)某些方法(例如,等待,休眠和连接)会认真对待此类请求,在收到中断请求时遇到异常或在进入时遇到已设置的中断状态.

(强调我的)

在这个特定的例子中,使用while(true)会产生相同的效果.但在其他情况下,如果循环从不调用可中断方法,或者如果要尽快退出,则必须定期检查线程是否被中断以便能够检测到中断.