为了账号安全,请及时绑定邮箱和手机立即绑定

sleep()

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

正在回答

4 回答

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

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


0 回复 有任何疑惑可以回复我~
#1

meersun

还是没搞明白,坐等大侠来搭救
2016-04-26 回复 有任何疑惑可以回复我~

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

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

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

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的线程,不是同一个线程,所以不会影响。但我认为这其中的原理更重要。

0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
深入浅出Java多线程
  • 参与学习       186085    人
  • 解答问题       464    个

带你一起深入浅出多线程,掌握基础,展望进阶路线

进入课程
意见反馈 帮助中心 APP下载
官方微信