1. 程式人生 > >執行緒優先順序和守護執行緒

執行緒優先順序和守護執行緒

全文概要

本文主要介紹執行緒的優先順序和守護執行緒。

  • 建立的執行緒預設的優先順序是5,當然可以自行設定優先順序,優先順序為[1,10]區間的整數
  • java中有兩種執行緒,使用者執行緒和守護執行緒,可以通過isDaemon()來判斷,返回true表示守護執行緒;
  • 使用者執行緒一般用來執行使用者級任務,而守護執行緒一般用來執行後臺任務,除此之外,守護執行緒有一個重要的特性:當所有的使用者執行緒全部執行完畢後,無論守護執行緒的邏輯是否完成,JVM會自動結束守護執行緒。

守護執行緒介紹

  • 程式碼案例
package com.tml.javaCore.thread;

public class DaemoDemo {
	public static void main(String[] args) {
		
		Thread thread_01 = new Thread(new  Runnable() {
			public void run() {
				System.out.println(Thread.currentThread().getName() + 
						":priority is:" + Thread.currentThread().getPriority() );
				for(int i=0;i<10;i++){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + ": is loop " + i);
				}
			}
		}, "thread_01");
		thread_01.setPriority(1);
		thread_01.start();
		
		
		Thread thread_02 = new Thread(new  Runnable() {
			public void run() {
				System.out.println(Thread.currentThread().getName() + 
						":priority is:" + Thread.currentThread().getPriority() );
				for(int i=0;i<100;i++){
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + ": is loop " + i);
				}
			}
		}, "thread_02");
		thread_02.setDaemon(true);//設定守護執行緒一定要在start()方法之前
		thread_02.setPriority(10);
		thread_02.start();
	}

}
  • 輸出結果

    thread_01:priority is:1
    thread_02:priority is:10
    thread_01: is loop 0
    thread_02: is loop 0
    thread_01: is loop 1
    thread_02: is loop 1
    thread_02: is loop 2
    thread_01: is loop 2
    thread_02: is loop 3
    thread_01: is loop 3
    thread_02: is loop 4
    thread_01: is loop 4
    thread_01: is loop 5
    thread_02: is loop 5
    thread_01: is loop 6
    thread_02: is loop 6
    thread_01: is loop 7
    thread_02: is loop 7
    thread_01: is loop 8
    thread_02: is loop 8
    thread_01: is loop 9

    thread_02: is loop 9

  • 結果分析
  1. 主執行緒中建立了連個執行緒,執行緒1的優先順序設定為1,執行緒2的優先順序設定為10,當設定執行緒優先順序的值不在[1,10]整數區間內,會丟擲java.lang.IllegalArgumentException執行時異常,除此之外,執行緒2還被設定為守護執行緒,注意設定守護執行緒一定要在start()方法之前,否則會丟擲java.lang.IllegalThreadStateException執行時異常;
  2. 由於列印的時候,執行緒睡眠100毫秒,這就導致執行緒1和執行緒2依次執行列印任務;
  3. 執行緒1是使用者執行緒,執行緒2是守護執行緒,當執行緒1執行完成後,JVM會自動結束執行緒2,即便執行緒2迴圈沒有結束。