请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

在Volatile修正案例中,isInterrupted()似乎是没有必要的??

在Volatile修正案例中,while循环似乎不需要判断isInterrupted()也可以停止运行,那么判断isInterrupted是否是没有必要的? 即便是加了isInterrupted()判断,异常却是由storage.put(num);抛出而并不是isInterrupted()方法跳过了while。而storage.put(num);发生阻塞不是在while中吗?似乎这种循环阻塞的情况不是不需要在while处判断isInterrupted()吗??

下边贴出我的  Volatile修正demo中生产者的run方法  参考。

// Volatile修正demo中生产者的run方法
@Override
public void run() {
    int num = 0;
    try {
        // 似乎并不需要判断(响应)停止期望,本线程也可以异常停止.
        //  !Thread.currentThread().isInterrupted()
        while (num <= 10000 ) {
            if (num % 100 == 0) {
                System.out.println("100的倍数放入仓库 num = " + num);
                storage.put(num); // InterruptedException
            }
            num++;
        }
    } catch (InterruptedException e) {
        e.printStackTrace();
    } finally {
        System.out.println("生产者停止运行");
    }
}

   


正在回答

1回答

悟空 2019-11-20 17:09:59
满了的时候put方法会检测,但是没满的时候也需要检查中断。
1 回复 有任何疑惑可以回复我~
  • 提问者 Small_6 #1
    但是经过我N久的考虑,认为加 !Thread.currentThread().isInterrupted() 也是很有必要的。 万一storage阻塞队列没有放满(当然本案例是放满的),就不会阻塞,不会阻塞就不会发生InterruptedException。因此,在没有出现阻塞的情况下期望子线程停止,!Thread.currentThread().isInterrupted() 就是至关重要的 [我真是个天才/滑稽]
    回复 有任何疑惑可以回复我~ 2019-11-20 22:00:27
  • 悟空 回复 提问者 Small_6 #2
    天才少年
    回复 有任何疑惑可以回复我~ 2019-11-20 23:45:13
  • MarcoLiLiLi 回复 悟空 #3
    悟空老师,我有个疑问: 上面同学说"万一storage阻塞队列没有放满,就不会阻塞,不会阻塞就不会发生InterruptedException"。
    但根据实验发现无论有没有满, 只要在主线程中运producerThread.interrupt() 这行代码, storage.put()都会响应中断,抛出异常。这似乎和上面同学的陈述有点出入,想麻烦老师confirm一下此时BlockingQueue的put响应能力范围。
    回复 有任何疑惑可以回复我~ 2020-03-29 21:17:08
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信