《Java程序员面试秘笈》—— 1.6 线程的休眠和恢复

简介: 有些时候,你需要在某一个预期的时间中断线程的执行。例如,程序的一个线程每隔一分钟检查一次传感器状态,其余时间什么都不做。在这段空闲时间,线程不占用计算机的任何资源。当它继续执行的CPU时钟来临时,JVM会选中它继续执行。

本节书摘来异步社区《Java 7并发编程实战手册》一书中的第1章,第1.6节,作者:【西】Javier Fernández González,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.6 线程的休眠和恢复

有些时候,你需要在某一个预期的时间中断线程的执行。例如,程序的一个线程每隔一分钟检查一次传感器状态,其余时间什么都不做。在这段空闲时间,线程不占用计算机的任何资源。当它继续执行的CPU时钟来临时,JVM会选中它继续执行。可以通过线程的sleep()方法来达到这个目标。sleep()方法接受整型数值作为参数,以表明线程挂起执行的毫秒数。当线程休眠的时间结束了,JVM会分给它CPU时钟,线程将继续执行它的指令。

sleep()方法的另一种使用方式是通过TimeUnit枚举类元素进行调用。这个方法也使用Thread类的sleep()方法来使当前线程休眠,但是它接收的参数单位是秒,最后会被转化成毫秒。

在本节中,我们将开发程序来完成这样的内容:使用sleep()方法,每间隔一秒就输出实际时间。

准备工作
本节的范例是在Eclipse IDE里完成的。无论你使用Eclipse还是其他的IDE(比如NetBeans),都可以打开这个IDE并且创建一个新的Java工程。

范例实现
按照接下来的步骤实现本节的范例。

1.创建一个名为FileClock的类,并且实现Runnable接口。
``
public class FileClock implements Runnable {``
2.实现run()方法。

@Override
public void run() {```
3.编写一个执行10次的循环。在每个循环中,创建一个Date对象,并把它写入到文件中,然后调用TimeUnit类的SECONDS属性的sleep()方法来挂起线程一秒钟。这个值将让线程休眠大概1秒钟。sleep()方法会抛出InterruptedException异常,我们必须捕获并处理这个异常。最佳实践是,当线程被中断时,释放或者关闭线程正在使用的资源。

for (int i = 0; i < 10; i++) {

 System.out.printf("%s\n", new Date());
 try {
  TimeUnit.SECONDS.sleep(1);

} catch (InterruptedException e) {

   System.out.printf("The FileClock has been interrupted");

}
}
}`
4.实现范例的主类。创建一个名为FileMain的类并包含main()方法。

public class FileMain {
  public static void main(String[] args) {```
5.创建FileClock类的一个对象,并用它作为传入参数来创建一个Thread对象,然后运行这个线程。

FileClock clock=new FileClock();
Thread thread=new Thread(clock);
thread.start();`
6.调用TimeUnit类的SECONDS属性的sleep()方法,休眠5秒钟。

try {
  TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
    e.printStackTrace();
};```
7.中断FileClock线程。
``
thread.interrupt();``
8.运行这个范例并且观察结果。

工作原理
当运行这个范例时,你可以看到程序每间隔一秒钟就会输出实际的时间,接下来是FileClock线程已经被中断的信息。

当调用sleep()方法之后,线程会释放CPU并且不再继续执行任务。在这段时间内,线程不占用CPU时钟,所以CPU可以执行其他的任务。

如果休眠中线程被中断,该方法就会立即抛出InterruptedException异常,而不需要等待到线程休眠时间结束。

更多信息
相关文章
|
1天前
|
缓存 Java 程序员
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
关于创建、销毁对象⭐Java程序员需要掌握的8个编程好习惯
|
1天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
9 0
|
1天前
|
设计模式 消息中间件 安全
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
【Java多线程】关于多线程的一些案例 —— 单例模式中的饿汉模式和懒汉模式以及阻塞队列
8 0
|
1天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
5 0
|
1天前
|
Java 数据库
【Java多线程】对线程池的理解并模拟实现线程池
【Java多线程】对线程池的理解并模拟实现线程池
9 1
|
1天前
|
Java
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
【Java多线程】分析线程加锁导致的死锁问题以及解决方案
9 1
|
1天前
|
存储 缓存 安全
【Java多线程】线程安全问题与解决方案
【Java多线程】线程安全问题与解决方案
8 1
|
1天前
|
Java 调度
【Java多线程】线程中几个常见的属性以及状态
【Java多线程】线程中几个常见的属性以及状态
7 0
|
1天前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
5 0
|
1天前
|
Java 调度
【Java多线程】对进程与线程的理解
【Java多线程】对进程与线程的理解
9 1