一、線程優先級的介紹
java 中的線程優先級的范圍是1~10,默認的優先級是5。“高優先級線程”會優先于“低優先級線程”執行。
java 中有兩種線程:用戶線程和守護線程。可以通過isDaemon()方法來區別它們:如果返回false,則說明該線程是“用戶線程”;否則就是“守護線程”。用戶線程一般用于執行用戶級任務,而守護線程也就是“后臺線程”,一般用來執行后臺任務。需要注意的是:Java虛擬機在“用戶線程”都結束后會后退出。
JDK 中關于線程優先級和守護線程的介紹如下:
每個線程都有一個優先級。“高優先級線程”會優先于“低優先級線程”執行。每個線程都可以被標記為一個守護進程或非守護進程。在一些運行的主線程中創建新的子線程時,子線程的優先級被設置為等于“創建它的主線程的優先級”,當且僅當“創建它的主線程是守護線程”時“子線程才會是守護線程”。
當Java虛擬機啟動時,通常有一個單一的非守護線程(該線程通過是通過main()方法啟動)。JVM會一直運行直到下面的任意一個條件發生,JVM就會終止運行:
(01) 調用了exit()方法,并且exit()有權限被正常執行。
(02) 所有的“非守護線程”都死了(即JVM中僅僅只有“守護線程”)。
每一個線程都被標記為“守護線程”或“用戶線程”。當只有守護線程運行時,JVM會自動退出。
二、線程優先級的示例
我們先看看優先級的示例 :
package com.demo.threadPriority; public class MyThread extends Thread{ public MyThread(String name) { super(name); } public void run(){ for (int i=0; i<5; i++) { System.out.println(Thread.currentThread().getName() +"("+Thread.currentThread().getPriority()+ ")" +", loop "+i); } } }
package com.demo.threadPriority; public class Demo { public static void main(String[] args) { System.out.println(Thread.currentThread().getName() +"("+Thread.currentThread().getPriority()+ ")"); Thread t1=new MyThread("t1"); // 新建t1 Thread t2=new MyThread("t2"); // 新建t2 t1.setPriority(1); // 設置t1的優先級為1 t2.setPriority(10); // 設置t2的優先級為10 t1.start(); // 啟動t1 t2.start(); // 啟動t2 } }
運行結果:
main(5) t1(1), loop 0 t1(1), loop 1 t2(10), loop 0 t1(1), loop 2 t2(10), loop 1 t1(1), loop 3 t2(10), loop 2 t1(1), loop 4 t2(10), loop 3 t2(10), loop 4
結果說明:
(01) 主線程main的優先級是5。
(02) t1的優先級被設為1,而t2的優先級被設為10。cpu在執行t1和t2的時候,根據時間片輪循調度,所以能夠并發執行。
三、守護線程的示例
下面是守護線程的示例。
package com.demo.daemonThread; public class MyThread extends Thread{ public MyThread(String name) { super(name); } public void run(){ try { for (int i=0; i<5; i++) { Thread.sleep(3); System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i); } } catch (InterruptedException e) { } } }
package com.demo.daemonThread; public class MyDaemon extends Thread{ public MyDaemon(String name) { super(name); } public void run(){ try { for (int i=0; i<10000; i++) { Thread.sleep(1); System.out.println(this.getName() +"(isDaemon="+this.isDaemon()+ ")" +", loop "+i); } } catch (InterruptedException e) { } } }
package com.demo.daemonThread; public class Demo { public static void main(String[] args) { System.out.println(Thread.currentThread().getName() +"(isDaemon="+Thread.currentThread().isDaemon()+ ")"); Thread t1=new MyThread("t1"); // 新建t1 Thread t2=new MyDaemon("t2"); // 新建t2 t2.setDaemon(true); // 設置t2為守護線程 t1.start(); // 啟動t1 t2.start(); // 啟動t2 } }
運行結果:
main(isDaemon=false) t2(isDaemon=true), loop 0 t2(isDaemon=true), loop 1 t1(isDaemon=false), loop 0 t2(isDaemon=true), loop 2 t1(isDaemon=false), loop 1 t2(isDaemon=true), loop 3 t2(isDaemon=true), loop 4 t1(isDaemon=false), loop 2 t2(isDaemon=true), loop 5 t2(isDaemon=true), loop 6 t1(isDaemon=false), loop 3 t2(isDaemon=true), loop 7 t2(isDaemon=true), loop 8 t2(isDaemon=true), loop 9 t1(isDaemon=false), loop 4
結果說明:
(01) 主線程main是用戶線程,它創建的子線程t1也是用戶線程。
(02) t2是守護線程。在“主線程main”和“子線程t1”(它們都是用戶線程)執行完畢,只剩t2這個守護線程的時候,JVM自動退出。
文章列表