Java 线程沉睡和唤醒

概要:

线程沉睡(sleep)并不会让线程释放它所持有的同步锁,而且在这期间也不会阻碍其他线程的运行。唤醒(interrupt)可以将沉睡或阻塞的线程唤醒。本实例介绍运用线程的沉睡和唤醒判断来设置线程的暂停和运行。

| |目录

技术要点

    运用线程沉睡和线程唤醒的技术要点如下:

  • 线程唤醒可以使当前线程沉睡一段时间,在这段时间内不会有时间轮流到该线程上,直到过完这段时间,线程又重新运行。

  • 线程唤醒可以使执行了sleep操作的线程或执行了wait操作或者join操作的线程唤醒。线程沉睡要指定沉睡的时间,如果对该线程执行interrupt操作,线程可以提早继续运行。

代码实现

package net.xsoftlab.baike;
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(); // 调用方法判断是否唤醒
	}
}

程序解读

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

  2. getUp()方法通过currentThread()方法获得当前线程,interrupt()方法唤醒该线程,isInterrupted()方法判断线程是否被唤醒。当线程被唤醒时如果调用休眠sleep()方法则会抛出唤醒异常。如果线程调用休眠sleep()方法没有在指定时间内休眠完毕就调用interrupt()方法,则该线程提前运行。

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


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消