歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java並發操作——Thread常見用法(Sleep,yield,後台線程)

Java並發操作——Thread常見用法(Sleep,yield,後台線程)

日期:2017/3/1 9:39:05   编辑:Linux編程

1)休眠 sleep

sleep()可以使任務中止執行一段時間(這段時間是指定的)。但是要注意的是對sleep()的調用可以拋出InterruptedException異常,並且這個異常在run()方法中就得捕獲,進行處理,這是因為異常不能跨線程傳播,所以我們必須在本地處理所有任務內部產生的異常。

在舊版本中,sleep的用法是這樣的,Thread.sleep(1000);

但是在Java SE5 之後引入了更加顯示的sleep()版本,作為TimeUnit類的一部分。 TimeUtil.MILLISECONDS.sleep(100);

注意下面這個程序:

Class Sleeper extends Thread {
private int sleepTime;

public Sleeper(String name,int sleepTime) {
super(name);
this.sleepTime = sleepTime;
start();
}
public void run() {
try {
sleep(sleepTime);
} catch(InterruptedException e) {
System.out.println(this.isInterrupted());//竟然是false,當一個線程在該線程上調用interrrupt()時,就會給該線程設定一個標記。表明這個線程已經被中斷,然而,在當異常比捕獲時,會清楚這個標記。所以在catch子句中,這個標記是false.
}

}

}

2)優先級

這個比較簡單,就不多說了,記住的是JDK有10個優先級,但是與多數操作系統都不能映射的很好。因此,在我們平時的操作中,一般情況下,只使用MAX_PRIORITY、NORM_PRIORITY和MIN_PRIORITY三種級別。

3)讓步 yield

當調用yield()時,即在建議具有相同優先級的其他線程可以運行了,但是注意的是,僅僅是建議,沒有任何機制保證你這個建議會被采納。一般情況下,對於任何重要的控制或者調用應用時,都不能依賴於yield()。這個方法經常被誤用。

4)後台線程

所謂後台線程(daemon),是指在程序運行的時候在後台提供一種通用服務的線程,並且這種線程並不屬於程序中不可或缺的部分,當所有的非後台線程結束時,程序也就終止了,同時會殺死進程中所有的後台線程。

必須在線程啟動之前調用setDaemon()方法,才能把它設置為後台線程。-

如果一個線程是一個後台線程那麼它創建的任何線程都將自動設置為後台線程。

我們應該意識到後台線程可以在沒有執行finally子句的情況下,終止其run()方法,看下面這個例子

import java.util.concurrent.TimeUnit;

public class ADaemonTest {

public class ADaemon implements Runnable {
@Override
public void run() {
try {
System.out.println("Starting Daemon");
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
System.out.println("exiting via InterruptedException");
} finally {
System.out.println("This should always run?");
}
}
}

public static void main(String[] args) {
ADaemonTest test = new ADaemonTest();
Thread t = new Thread(test.new ADaemon());
t.setDaemon(true);
t.start();

}

}

上面的執行結果是:

Starting Daemon

如果我們把
t.setDaemon(true);

注釋掉,則運行結果為

Starting Daemon
This should always run?

如果我們把
TimeUnit.MILLISECONDS.sleep(100); 改為
TimeUnit.MILLISECONDS.sleep(1);

則運行結果為

Starting Daemon
This should always run?

上面的三種執行情況及其記過說明兩點:

1)非後台線程是會執行finally的

2. 後台線程可能會執行,也有可能不會執行finally子句,這說明finally子句不一定就會執行。

5)join

一個線程可以再其他線程上調用join()方法,其效果是等待一段時間直到第二個線程結束,才繼續執行。

也可以再調用join()時帶上一個超時參數(單位可以是毫秒,或者秒等),這樣如果目標線程在這段時間到期時還沒有結束,join()方法總能返回。

PS:我們可以在一個普通的方法中創建一個線程。當我們准備好運行線程時,就可以調用這個方法。而在線程開始之後(注意是start()之後,而非run()方法執行結束),該方法將返回。

大話設計模式(帶目錄完整版) PDF+源代碼 http://www.linuxidc.com/Linux/2014-08/105152.htm

Java中介者設計模式 http://www.linuxidc.com/Linux/2014-07/104319.htm

Java 設計模式之模板方法開發中應用 http://www.linuxidc.com/Linux/2014-07/104318.htm

設計模式之 Java 中的單例模式(Singleton) http://www.linuxidc.com/Linux/2014-06/103542.htm

Copyright © Linux教程網 All Rights Reserved