執行緒管理(五)執行緒的睡眠和恢復
宣告:本文是《 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 不保證它會遵守請求。通常,它只是用來試調的。