线程睡眠唤醒问题,一直不明白,请给解释一下.程序来自:Java 案例大全
/* 1 getUp()里的这句,Thread.currentThread().interrupt();要把谁唤醒? 这个线程是谁?
2 text.join(),这句要一直执行完,执行完后,这个线程结束了. 但怎么输出的结果"Thread-0 15-26-45:0570Thread-0 唤醒异常:sleep interrupted" 还有Thread-0呢?
*/
package com.zf.s14;//创建一个包
import java.text.DateFormat;//引入类
import java.text.SimpleDateFormat;
import java.util.Date;
public class TextSleepAndInterrupt extends Thread {// 操作线程沉睡与唤醒的类
private DateFormat dateFormat = new SimpleDateFormat("HH-mm-ss:SSSS");
public void run() {
System.out
.println(dateFormat.format(new Date()) + getName() + " 沉睡3秒钟");
try {
sleep(3000);// 线程休眠3秒
} catch (InterruptedException e) {// 捕获唤醒异常
System.out.println(getName() + dateFormat.format(new Date())
+ getName() + " 唤醒异常:" + e.getMessage());
}
System.out.print(dateFormat.format(new Date()) + " 沉睡期间是否唤醒?");
try {
sleep(2000);// 线程休眠2秒
} catch (InterruptedException e) {// 捕获唤醒异常
System.out.println(getName() + dateFormat.format(new Date())
+ getName() + " 唤醒异常:" + e.getMessage());
}
System.out.println(!isAlive());// 线程是否激活,false表示不是激活的
interrupt();// 唤醒线程
System.out.print(dateFormat.format(new Date()) + " 沉睡的我,是否唤醒?");
System.out.println(isAlive());// 线程是否激活
}
public void getUp(){
Thread.currentThread().interrupt();// 唤醒当前线程
while (true) {
if (Thread.currentThread().isInterrupted()) {// 判断当前线程是否被唤醒
System.out.println(dateFormat.format(new Date())+" 当前我是否被唤醒 ?"
+ Thread.currentThread().isInterrupted());
try {
Thread.currentThread().sleep(2000);// 线程休眠2秒
} catch (InterruptedException e) {// 捕获唤醒异常
System.out.println(getName() + dateFormat.format(new Date())
+ getName() + " 唤醒异常:" + e.getMessage());
}
System.out.println(dateFormat.format(new Date())+" 沉睡后是否被唤醒?"
+ Thread.currentThread().isInterrupted());
}
}
}
public static void main(String[] args) {// java程序主入口处
TextSleepAndInterrupt text=new TextSleepAndInterrupt();//实例化对象
text.start();//启动线程
try {
text.join();//等待线程运行结束
} catch (InterruptedException e) {// 捕获唤醒异常
System.out.println(" 唤醒异常:" + e.getMessage());
}
text.getUp();//调用方法判断是否唤醒
}
}
/* 这是运行输出结果
5-26-40:0569Thread-0 沉睡3秒钟
15-26-43:0570 沉睡期间是否唤醒?false
15-26-45:0570 沉睡的我,是否唤醒?true
15-26-45:0570 当前我是否被唤醒 ?true
Thread-015-26-45:0570Thread-0 唤醒异常:sleep interrupted
15-26-45:0570 沉睡后是否被唤醒?false
*/
[解决办法]
Thread.currentThread().interrupt();是将当前线程中断,让出CPU.
[解决办法]
LZ,这个不是唤醒,这个是线程中断,线程在sleep的时候是阻塞等待的,如果收到中断信号,就会在调用的方法(这里是sleep)上抛出InterruptedException异常,这个是中断线程。。
唤醒是 wait 和 notify 、 notifyAll,在线程wait在某的管程上时,可以有线程对此管程上的线程做notify或 notifyAll 操作,来唤醒wait在此管程上的线程
[解决办法]
不是都说线程问题都在每个线程里建个print来看就可以了么.。喵.
[解决办法]
LZ你不就只有一个线程么
[解决办法]
TextSleepAndInterrupt text=new TextSleepAndInterrupt();//实例化对象
text.start(); //启动线程
System.out.println(dateFormat.format(new Date()) + getName() + " 沉睡3秒钟");
sleep(3000);
System.out.print(dateFormat.format(new Date()) + " 沉睡期间是否唤醒?");
sleep(2000);
System.out.println(!isAlive()); // 线程是否激活,false表示不是激活的
这个时候还没有调用过当前线程的interrupt方法所以 ,线程未被 中断,所以isAlive()返回true
!isAlive()返回false
即打印
5-26-40:0569Thread-0 沉睡3秒钟
15-26-43:0570 沉睡期间是否唤醒?false
接下来你调用了
interrupt();
这个时候 当前线程收到中断信号,但线程还未结束所以isAlive()返回true
打印出
15-26-45:0570 沉睡的我,是否唤醒?true
现在TextSleepAndInterrupt线程执行完毕
text.join();//这句的意思就是等text线程执行完毕 再继续执行当前线程
TextSleepAndInterrupt线程执行完毕后,执行
text.getUp();
其实这个调用是main线程在调用的
进入方法后
Thread.currentThread().interrupt(); // 唤醒当前线程
则main线程接收到中断信号
if (Thread.currentThread().isInterrupted()) 返回true
进入if
执行
System.out.println(dateFormat.format(new Date())+" 当前我是否被唤醒 ?"
+ Thread.currentThread().isInterrupted());
此时线程已接收到中断信号,即Thread.currentThread().isInterrupted()为true
所以显示
15-26-45:0570 当前我是否被唤醒 ?true
接下来执行
try {
Thread.currentThread().sleep(2000); // 线程休眠2秒
} catch (InterruptedException e) { // 捕获唤醒异常
System.out.println(getName() + dateFormat.format(new Date())
+ getName() + " 唤醒异常:" + e.getMessage());
}
因为main 线程已经 收到过中断信号 (就是进入方法的时候调用 的Thread.currentThread().interrupt(); ),所以调用方法的时候直接就抛出了InterruptedException,
所以执行System.out.println(getName() + dateFormat.format(new Date())
+ getName() + " 唤醒异常:" + e.getMessage());
打印了出
Thread-015-26-45:0570Thread-0 唤醒异常:sleep interrupted
最后的
System.out.println(dateFormat.format(new Date())+" 沉睡后是否被唤醒?"
+ Thread.currentThread().isInterrupted());
因为main的中断信号已经 被 处理(即抛出了InterruptedException),所以main线程恢复到未被 中断状态,所以Thread.currentThread().isInterrupted()返回false
打印出
15-26-45:0570 沉睡后是否被唤醒?false
[解决办法]
首先要理解一个概念,线程一旦wait()。自己是不可能唤醒自己的!要其他线程来唤醒它
当线程Await()时候,让出CPU,多线程的情况下,会跳到其他线程执行
[解决办法]
你要看清楚,getName返回是线程TextSleepAndInterrupt 的名字,这个是实例方法,返回的是本线程的名字,只是说我已经执行完了,但我的名字还是我的,如果你想打出main,那应该告诉他我要打出的名字是执行你的这个线程的名字
Thread.currentThread.getName();
给你个例子,你研究下
- Java code
public class StubTest { public static void main(String[] args) throws Exception{ Rund r = new Rund(); r.start(); r.join(); r.d(); } static class Rund extends Thread{ @Override public void run() { // TODO Auto-generated method stub } public void d(){ System.out.println(getName()); System.out.println(Thread.currentThread().getName()); } }} 