请稍等 ...
×

采纳答案成功!

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

使用Join(或者自己实现Join)主线程被提前唤醒

最近假期太长二刷的时候发现一个问题,请老师帮我看看。

public class JoinPrincipleException {
    public static void main(String[] args) throws InterruptedException {
        Thread mainThread = Thread.currentThread();
        Thread thread =  new Thread(()->{
            try {
                mainThread.interrupt();
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"执行完毕");
        });
        thread.start();
        System.out.println("开始等待子线程运行完毕");
        //thread.join();
        synchronized (thread){
            try {
                thread.wait();   //wait只有在synchronized代码块中才能运行
            } catch (InterruptedException e) {
                System.out.println("主线程被中断了!");
            }
        }
        System.out.println("所有子线程执行完毕");
    }
}

打印结果

第一阶段:

主线程进入waiting状态,子线程执行mainThread.interrupt();

主线程在wait状态下被中断,但是老师讲过:“必须要等到被唤醒后,并且拿到锁之后才能响应中断的,wait期间什么都做不了”

问题:
子线程对主线程进行中断后,立马进入sleep(10000) 10秒,所以这段时间子线程并没有执行完成,所以thread并没有调用 thread.notifyAll()这个方法来唤醒主线程。但是主线程却响应了中断,这与老师“必须要等到被唤醒后,并且拿到锁之后才能响应中断的,wait期间什么都做不了”这句话有些矛盾,或者是说main线程在子线程执行完成之前就已经得到唤醒,那么又是谁去唤醒的呢

图片描述
阶段二
10s后打印出 Thred-0执行完毕
图片描述
图片描述
确实如老师所说,wait()和sleep()响应中断的时候确实会被唤醒,以前只注意到sleep没注意到wait

正在回答

1回答

悟空 2020-02-17 17:12:41

中断就是一种唤醒,讲中断原理那个小节的时候,分析cpp源码的时候讲过哈。

0 回复 有任何疑惑可以回复我~
  • 提问者 Panda_io #1
    确实如老师所说,wait()和sleep()响应中断的时候确实会被唤醒,以前只注意到sleep没注意到wait,图片补充在上面了,后面小伙伴遇到这个问题也能解决了嘿嘿。
    回复 有任何疑惑可以回复我~ 2020-02-17 17:22:19
  • 悟空 回复 提问者 Panda_io #2
    恩,点赞
    回复 有任何疑惑可以回复我~ 2020-02-17 17:29:55
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信