线程沉睡(sleep)并不会让线程释放它所持有的同步锁,而且在这期间也不会阻碍其他线程的运行。唤醒(interrupt)可以将沉睡或阻塞的线程唤醒。


线程沉睡:线程沉睡可以使当前线程沉睡一段时间,在这段时间内不会有时间片分配给线程。直到过完这段时间,线程又重新运行。


线程唤醒:线程唤醒可以使得执行了sleep操作的线程或执行了wait操作或者join操作的线程唤醒。线程沉睡要指定沉睡的时间,如果对该线程执行interrput 操作,线程可以提早继续运行,但是对于唤醒线程,单线程自己无法唤醒自己,只能等休眠结束。如果要在休眠中唤醒自己只能由另一线程唤醒自己。


线程连接:线程连接是线程间运行调度的一种操作,即线程需要等待其他线程运行结束后才能够开始,否则继续等待下去。线程连接有两种形式:join(参数)和join(),在join(参数)方法中参数表示等待的时间,单位是毫秒。若超出这个时间,则无论前面线程是否执行完毕,该线程都会继续运行。如果时间为0,则表示无期限等待。join()方法相当于join(0),表示无期限地等待。


源程序


package core;

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());
		}
		interrupt();//唤醒线程,单线程自己无法唤醒自己,只能等休眠结束,可看控制台的输出时间。如果要在休眠中唤醒自己只能由另一线程唤醒自己
		System.out.println(dateFormat.format(new Date())+" 沉睡的我,是否唤醒?"+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(1); //线程休眠
				} catch (InterruptedException e) {
					System.out.println(dateFormat.format(new Date())+" "+getName()+" 唤醒异常 "+e.getMessage()+" "+Thread.currentThread().isInterrupted());
				}
				System.out.println(dateFormat.format(new Date())+" 沉睡后是否被唤醒? "+Thread.currentThread().isInterrupted());
			}
		}
	}
	public static void main(String[] args) {
		TextSleepAndInterrupt text=new TextSleepAndInterrupt();
		text.start();//启动线程
		try {
			text.join(); //线程连接 线程需要等待其他线程运行结束后才能够开始
		} catch (InterruptedException e) {//捕获唤醒异常
			e.printStackTrace();
			System.out.println(" 唤醒异常: "+e.getMessage());
		}
		text.getUp();
	}
}

运行截图


java 网络唤醒 java 唤醒sleep中的线程_java



源程序解读



源代码感觉设计的有问题,这里是经过简化和整理后的代码。



(1)TextSleepAndInterrupt类继承Thread类必须要实现run()方法。在run()方法中调用Thread类的sleep()方法让线程休眠(暂停)指定的时间,如果出现异常则线程被唤醒。isAlive()方法表示线程是否是被激活,如果是激活的则返回真,否则返回假。



(2)getUp()方法通过currentThread()方法获得当前线程,interrupt()方法唤醒该线程,isInterrupted判断线程是否被唤醒。当线程被唤醒时如果调用休眠sleep()方法则会抛出唤醒异常。



(3)在main()主方法中线程的join()方法是等待前一个或几个线程运行结束后再运行getUp()方法。