另一种情形是TimeUnit枚举类型的元素使用sleep()方法。这种方式使用Thread类的sleep()方法让当前线程休眠,其参数以元素单位为准,并转换为毫秒。
在本节中,我们开发一个程序,使用sleep()方法记录当前真实运行时间。
准备工作
本范例通过Eclipse开发工具实现。如果使用诸如NetBeans的开发工具,打开并创建一个新的Java项目。
实现过程
通过如下步骤完成范例:
-
创建ConsoleClock类,指定其实现Runnable接口:
public class ConsoleClock implements Runnable {
-
实现run()方法:
@Override public void run() {
-
实现重复10次的循环,每次循环中创建Date对象,在控制台中输出当前时间,然后调用TimeUnit类中sleep方法的SECONDS属性延缓线程执行1秒钟,即线程将大约休眠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 ConsoleClock has been interrupted"); } } }
-
我们已经实现线程。现在实现范例的主类。创建包含main()方法的Main类:
public class Main { public static void main(String[] args) {
-
创建FileClock类的对象以及运行此对象的线程。然后,开始执行线程:
ConsoleClock clock = new ConsoleClock(); Thread thread = new Thread(clock); thread.start();
-
在主线程中调用TimeUnit类中sleep()方法的SECONDS属性,等待5秒钟:
try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
-
中断FileClock线程:
thread.interrupt();
-
运行程序,查看结果。
工作原理
当运行范例时,可以在控制台中看到每隔一秒输出Date对象信息,还有表明FileClock线程已经被中断的信息。
当调用sleep()方法时,线程会在一段时间内预留CPU资源停止执行。在这期间,线程不占用处理器时间,所以处理器能够执行其他任务。
当正在休眠的线程被中断时,sleep()方法会立刻抛出InterruptedException异常,而不会等待其休眠时间结束。
扩展学习
Java并发API中还有能够让线程对象预留CPU资源的方法。yield()方法可以指示Java虚拟机,线程对象能够给其它任务预留CPU资源。但Java虚拟机不必一定执行该请求。正常情况下,此方法只用于调式目的。