2 winter wind winter_wind 于 2016.02.10 16:02 提问

java线程的休眠和唤醒

public class thread5{
public static void main(String[] args){
compute t=new compute();
t.start();
t.interrupt();
}
}

class compute extends Thread{
//int i=0;
public void run(){
System.out.println("1");
try{
sleep(10000);
} catch (Exception e){
System.out.println("2");
}
}
}
以上程序本意是要输出1后休眠10秒后输出2,可是运行后,程序直接输出1和2,根本没有休眠就被唤醒输出了,这是为何呢?

3个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.10 19:36
已采纳

因为你的线程在休眠操作时被中断了,而休眠操作sleep是支持中断的,所以休眠操作异常而代码直接进入异常分支,线程执行结束。去掉i. interrupt操作就们让代码的休眠操作正常结束。

winter_wind
winter_wind 回复winter_wind: 必须放在}外面
2 年多之前 回复
winter_wind
winter_wind 去掉t.interrupt的话,System.out.println("2");这条语句无法执行了
2 年多之前 回复
caozhy
caozhy 这才是正解。
2 年多之前 回复
mogu_mazha
mogu_mazha   2016.02.10 19:54

3楼正解,因为你调用了t.interrupt()方法,这个方法会中断以下3个方法带来的休眠(阻塞):
(1)sleep()
(2)join()
(3)wait()

winter_wind
winter_wind 原来这样,我还以为休眠到设定值后在唤醒,那休眠和唤醒不能同时在一个类里,这样就没意义了是吗
2 年多之前 回复
91program
91program   Ds   Rxr 2016.02.10 16:29

System.out.println("2"); 语句是在 try... catch的异常处理之中,正常是不会执行这一句才对啊!
你改为这样试试:

System.out.println("1");
sleep(10000);
try{
// sleep(10000);
} catch (Exception e){
System.out.println("2");
}
91program
91program 回复winter_wind: 如果异常抛出,则不会执行 try 中的语句,所以你写在 try 中的 Sleep 语句是不会被执行的。
2 年多之前 回复
winter_wind
winter_wind 这样的话无法解决InterruptedException抛出异常
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
线程-休眠和唤醒
ThreadState是一个枚举类型,它反映的是线程所处的状态。当一个Thread实例刚创建时,它的ThreadState是Unstarted;当此线程被调用Start()启动之后,它的ThreadState是 Running;  在此线程启动之后,如果想让它暂停(阻塞),可以调用Thread.Sleep() 方法,它有两个重载方法(Sleep(int )、Sleep(Timespan )),
java 参赛者的比赛生活(线程休眠唤醒)
java 参赛者的比赛生活(线程休眠唤醒) java 参赛者的比赛生活(线程休眠唤醒) java 参赛者的比赛生活(线程休眠唤醒)
【进程&线程】睡眠与唤醒
无法进入临界区的时候选择阻塞而不是忙等待。有sleep和wakeup两个方法。 信号量semaphore up和down两种操作。down做减一操作,如果信号量大于0就减一,不然就睡眠线程。关键在于原子操作,所以一般是在系统层面的。 首先两个进程同时运行。当A进程想进入临界区的时候执行down操作来做标记,把一般信号量和mutex(互斥锁)都down一遍,这个时候
java中线程的等待与唤醒
1. 线程的挂起和唤醒       挂起实际上是让线程进入“非可执行”状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行;在线程挂起后,可以通过重新唤醒线程来使之恢复运行。 挂起的原因可能是如下几种情况:      (1)通过调用sleep()方法使线程进入休眠状态,线程在指定时间内不会运行。      (2)通过调用join()方法使线程挂起,使自己
JAVA多线程——线程的休眠和恢复
线程休眠的两种方式: 1. Thread.sleep() 与锁操作无关,如果该方法恰好在一个锁的保护范围之内,当前线程即使在执行sleep()的时候,仍然继续保持监视锁。  sleep方法实际上仅仅是完成等待或者睡眠的语义 2.Object.wait() 当线程执行到wait()方法上,当前线程会释放监视锁,此时其他线程可以占有该锁 一旦wait()方法执行完成,当
Java线程学习笔记(四)-线程沉睡,唤醒,连接
线程沉睡(sleep)并不会让线程释放它所持有的同步锁,而且在这期间也不会阻碍其他线程的运行。唤醒(interrupt)可以将沉睡或阻塞的线程唤醒。 线程沉睡:线程沉睡可以使当前线程沉睡一段时间,在这段时间内不会有时间片分配给线程。直到过完这段时间,线程又重新运行。 线程唤醒:线程唤醒可以使得执行了sleep操作的线程或执行了wait操作或者join操作的线程唤醒。线程沉睡要指定沉睡的时间,如
java 多线程—— 线程等待与唤醒
第1部分 wait(), notify(), notifyAll()等方法介绍   在Object.java中,定义了wait(), notify()和notifyAll()等接口。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。而notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而no
线程中各种唤醒、等待、睡眠方法之间的区别
一、notify()方法和notifyAll()方法的区别 notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。 notify则文明得多他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有
Java线程休眠(sleep)示例
java.lang.Thread的sleep()方法能使当前线程暂停运行一段时间(单位毫秒)。需要注意的是,sleep()方法的参数不能为负,否则会抛出IllegalArgumentException异常。     除此之外,还有另一个方法sleep(long millis, int nanos),该方法可用于使当前线程暂停millis毫秒nanos纳秒。需要注意的是,参数nanos的取值范围为
linux内核线程睡眠与唤醒
这里以内核usb gadget driver中f_mass_storage驱动为例子进行说明。static int sleep_thread(struct fsg_common *common) { int rc = 0;/* Wait until a signal arrives or we are woken up */ for (;;) { try_to_freeze(); s