请稍等 ...
×

采纳答案成功!

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

本节5分15秒,“子线程的休眠时间加长”的疑问

   老师您好,您在本节5分15秒说,“要把子线程的休眠时间加长,改为Thread.sleep(2000),要确保在子线程休眠过程中,去中断子线程”。(ps:这块语速有点快,可能复述不清楚,以视频为准)。
 我的疑问是:
    第一个疑问:在5-4节时候,讲的是“interrupt是一个信号,这个信号并不是实时检测的,也不是每行代码都能检测的,只有程序运行到sleep时,才能检测到线程被中断了,然后会抛出异常”。 感觉这2个说法不一样,望老师指导。
    第二疑问:我自己试了子线程的休眠时间,改为比1s小,例如Thread.sleep(50),其达到的效果和Thread.sleep(2000)是一样的。  所以还是不理解为啥要设置Thread.sleep(2000)啊?

Thread.sleep(50)的代码:

public class RigthWayStopThreadInProd  implements  Runnable{

    @Override
    public void run(){
        while (true){
            System.out.println("go");
            throwInMethod();
        }
    }

    private void throwInMethod(){
        try {
            Thread.sleep(50);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws  InterruptedException{
        Thread thread = new Thread(new RigthWayStopThreadInProd());
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();

    }
}

Thread.sleep(50)的结果:

"D:\Program Files\Java\jdk1.8.0_25\bin\java.exe" -Dvisualvm.id=206304728283300 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2018.2.6\lib\idea_rt.jar=8549:D:\Program Files\JetBrains\IntelliJ IDEA 2018.2.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_25\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_25\jre\lib\rt.jar;E:\.IntelliJIdea2018.2\concurrency_in_practice\target\classes" threadcorekonwledge.stopthreads.RigthWayStopThreadInProd
go
go
go
go
go
go
go
go
go
go
go
go
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at threadcorekonwledge.stopthreads.RigthWayStopThreadInProd.throwInMethod(RigthWayStopThreadInProd.java:20)
	at threadcorekonwledge.stopthreads.RigthWayStopThreadInProd.run(RigthWayStopThreadInProd.java:14)
	at java.lang.Thread.run(Thread.java:745)
go
go
go
go
go
go
go
go
go
go
go
go

Process finished with exit code -1

正在回答

1回答

悟空 2019-11-27 23:27:25

第1个疑问的是这样子的,在休眠过程中或者是刚进入 sleep,都能感受到中断。在本例中,确实不一定需要把时间改成2秒,因为有 while的死循环。

把时间改为两秒的主要目的是,当主线程中断信号发出的那一刻,子线程立刻就能感受到,为的就是这样的一个目的。因为啊,如果我们如果子线程休眠时间很短,而业务逻辑时间很长,那么一旦它的休眠时间到了,比如50ms过了之后,就只能等下次循环到 sleep时才能感受都中断了,就做不到“当主线程中断信号发岀的那刻,子线程立刻就能感受到”这个效果了。不过这个效果并不是必须的,所以改成 sleep(50也是完全ok的。


0 回复 有任何疑惑可以回复我~
  • 提问者 RCS2019 #1
    抱歉才看见,老师回复的很及时,感谢。  我还是想确认下:“子线程休眠时间2秒,比主线程休眠时间1s长,是为了在第一次循环时候,子线程就能感受到中断。    如果子线程休眠时间太短,就有可能第一次循环无法感受到中断”。  是这样吗?
    回复 有任何疑惑可以回复我~ 2019-11-28 23:08:25
  • 悟空 回复 提问者 RCS2019 #2
    是的没错
    回复 有任何疑惑可以回复我~ 2019-11-29 03:13:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信