1. 程式人生 > >執行緒管理(五)執行緒的睡眠和恢復

執行緒管理(五)執行緒的睡眠和恢復

宣告:本文是《 Java 7 Concurrency Cookbook 》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷 校對:歐振聰

執行緒的睡眠與恢復

有時, 你會感興趣在一段確定的時間內中斷執行執行緒。例如, 程式的一個執行緒每分鐘檢查反應器狀態。其餘時間,執行緒什麼也不做。在這段時間,執行緒不使用任何計算機資源。過了這段時間,當JVM選擇它時,執行緒會準備好繼續執行。為達此目的,你可以使用Thread類的 sleep() 方法 。此方法接收一個整數作為引數,表示執行緒暫停執行的毫秒數。 在呼叫sleep() 方法後,當時間結束時,當JVM安排他們CPU時間,執行緒會繼續按指令執行,

另一種可能是使用一個有TimeUnit列舉元素的sleep() 方法,使用執行緒類的 sleep() 方法讓當前執行緒睡眠,但是它接收的引數單位是表示並轉換成毫秒的。

在這個指南中, 我們將開發一個程式使用sleep()方法來每秒寫入真實的日期。

準備

指南中的例子是使用Eclipse IDE 來實現的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 開啟並建立一個新的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類的物件並讓一個執行緒執行它。然後,開始執行執行緒。

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.   執行例子並檢視結果。

它是怎麼工作的

當你執行這個例子,你可以發現程式是如何每秒寫入一個Date物件的,然後,有資訊顯示FileClock執行緒被中斷。

當你呼叫sleep()方法, Thread 離開CPU並在一段時間內停止執行。在這段時間內,它是不消耗CPU時間的,使用可以執行其他任務。

當 Thread is是睡眠和中斷的時候,那方法會立刻丟擲InterruptedException異常並不會一直等到睡眠時間過去。

更多

Java 併發 API 有另一種方法能讓執行緒物件離開 CPU。它是 yield() 方法, 它向JVM表示執行緒物件可以讓CPU執行其他任務。JVM 不保證它會遵守請求。通常,它只是用來試調的。