1. 程式人生 > 程式設計 >Java執行緒優先順序和守護執行緒原理解析

Java執行緒優先順序和守護執行緒原理解析

一、執行緒優先順序的介紹

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 2
t2(10),loop 1
t1(1),loop 3
t2(10),loop 2
t1(1),loop 4
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 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 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自動退出。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。