问答详情
源自:3-3 Java线程停止广为流传的错误方法---interrupt方法

sleep()

第10行的 sleep() 为什么不会使interrupt抛出异常

提问者:qq_大人物_0 2016-03-25 10:59

个回答

  • 我爱孙佳怡
    2019-05-22 11:21:00

    感觉听视频里讲,不如来看评论,评论描述的还清楚些

  • meersun
    2016-04-26 22:58:36

    第10行的sleep,休眠的是main主线程,这样thread线程可以独占cpu运行。主线程休眠了3秒,中间thread输出了三条Thread is running,每秒一条。sleep结束后,主线程重新占用cpu,输出interrupting threading。。。主线程又休眠三秒,让出cpu,但是interrupt没有起作用(为什么?)thread 继续每秒一条无限输出


  • changrui0608
    2016-04-09 11:34:37

    根据我知道的说一下我的理解,不保证一定正确,如有错误欢迎指正。

    其实这个问题引出了一些很有用的点。

    先把视频中的代码贴出来,除了最后几行,行数都是对应的

    package base;
    
    public class WrongWayStopThread extends Thread {
    
    	public static void main(String[] args) {
    		WrongWayStopThread thread = new WrongWayStopThread();
    		System.out.println("Starting Thread...");
    		thread.start();
    		try {
    			Thread.sleep(3000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println("Interrupting Thread...");
    		thread.interrupt();
    		try {
    			Thread.sleep(3000);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    		System.out.println("Stopping Application...");
    	}
    
    	@Override
    	public void run() {
    		while (true) {
    			System.out.println("Thread is running");
    			long time = System.currentTimeMillis();
    			while (System.currentTimeMillis() - time < 1000) {
    				// ...
    			}
    		}
    	}
    }

    第一个点,main本身也是一个线程,通常称为主线程,这个程序一开始做的事情是,主线程创建了一个WrongWayStopThread实例,叫做thread,并start之,此时主进程和thread同时运行

    第二个点,sleep()是static的,sleep()做的事情是将“当前sleep()所在”进程休眠

    题主说的第十行附近的

    Thread.sleep(3000);

    是对语句所在进程,即主进程进行sleep。注意这里的Thread是大写,代表的是调用Thread类的静态方法sleep。

    (注意即使改成小写thread.sleep(3000),因为是static方法,执行的是的同样操作,依旧是休眠主进程,可以试验验证。换句话说,不管怎么写sleep,一个线程只能对自己进行自发的sleep,不能sleep别的进程)

    然后15行的

    thread.interrupt();

    注意interrupt不是static,任意进程都可以对指定的另一个线程做interrupt,这里thread是小写,指的是主线程对刚刚创建的WrongWayStopThread实例thread做interrupt。


    总结就是,第十行左右的sleep的线程,和之后interrupt的线程,不是同一个线程,所以不会影响。但我认为这其中的原理更重要。

  • 粽子何
    2016-03-25 12:39:33

    sleep()方法只是使当前线程暂时进入休眠状态,并没有阻断当前线程的运行。