1、守護線程
在Java中有兩種線程:一種是用戶線程,另一種是守護線程。可以通過isDaemon()方法來進行區分,如果返回false,說明該線程是用戶線程;如果返回true,則說明該線程是守護線程。
守護線程是指爲其他線程服務的線程,也就是“後臺線程”,一般用來執行後臺任務。守護線程最經典的應用就是GC(垃圾回收器)。
下面使用代碼來演示一下:
public class DaemonThread {
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("我是子線程 i:" + i);
}
}
});
// 設置爲守護線程
thread.setDaemon(true);
thread.start();
for (int i = 0; i < 30; i++) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println("我是主線程 i:" + i);
}
System.out.println("主線程執行完畢~!");
}
}
當主線程執行完畢之後,子線程(守護線程)也會停止。
注意點:
- thread.setDaemon(true)必須在thread.start()之前設置,否則會拋出IllegalThreadStateException異常;
- 在守護線程中產生的新線程也是守護線程;
- 不要使用守護線程去訪問固有資源,比如讀寫操作或者計算邏輯。因爲它可能會在任何一個時候,甚至是在一個操作的中間發生中斷。
2、線程優先級
Java提供了一個線程調度器來監控程序啓動後進入就緒狀態的所有線程。線程調度器通過線程的優先級來決定調度哪些線程執行。一般來說,Java的線程調度器採用時間片輪轉算法使多個線程輪轉獲得CPU的時間片。然而在實際的情況中,由於每個線程的重要程度不同,有時候我們想讓一些線程優先執行,那麼我們就可以將它的優先級調高一下,這樣它獲得的時間片就會多一些。
在java 中線程優先級的範圍是1~10,默認優先級爲5。“高優先級線程”會優先於“低優先級線程”執行。
class PrioritytThread extends Thread {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "---"+i);
}
}
public static void main(String[] args) {
PrioritytThread t1=new PrioritytThread();
PrioritytThread t2=new PrioritytThread();
PrioritytThread t3=new PrioritytThread();
t1.setName("Thread-1");
t2.setName("Thread-2");
t3.setName("Thread-3");
// 注意設置了優先級,不代表每次都一定會先被執行,只是CPU調度會優先分配
t1.setPriority(10);//優先級必須設置在start之前
t3.start();
t1.start();
t2.start();
}
}
運行結果
由運行結果可以看出,優先級高的線程不一定比優先級低的線程先執行,而是優先級高的線程先執行的概率比優先級低的線程先執行的概率高。
注意:優先級 thread.setPriority() 必須設置在 thread.start() 之前。