1. 程式人生 > >菜鳥成長之路之Thread的setPriority()設定優先順序原始碼分析(5)

菜鳥成長之路之Thread的setPriority()設定優先順序原始碼分析(5)

我們知道執行緒在執行start()之後,如果沒有cpu執行權的話,它是在runnable狀態,而不會進入到running狀態或者exception狀態,而且各個執行緒執行的結果次數也有可能不會是一樣的,這體現了多執行緒的不確定性,那麼我們可以通過設定優先順序來讓執行緒執行的次數如自己所想隨心所欲呢?

下面我們來看Thread的setPriority()方法,

 public final void setPriority(int newPriority) {
        ThreadGroup g;
        checkAccess();
        if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {
            throw new IllegalArgumentException();
        }
        if((g = getThreadGroup()) != null) {
            if (newPriority > g.getMaxPriority()) {
                newPriority = g.getMaxPriority();
            }
            setPriority0(priority = newPriority);
        }
    }

更改執行緒的優先順序。

首先呼叫執行緒的 checkAccess 方法,且不帶任何引數。這可能丟擲 SecurityException

在其他情況下,執行緒優先順序被設定為指定的 newPriority 和該執行緒的執行緒組的最大允許優先順序相比較小的一個。

引數:

newPriority - 要為執行緒設定的優先順序

丟擲:

- 如果優先順序不在 MIN_PRIORITYMAX_PRIORITY 範圍內。

以上抄自JDK1.7Api

下面我們來寫下程式碼實現下:

public static void main(String[] args) {
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 100; i++) {
					System.out.println(Thread.currentThread().getName()+"---"+i);
				}
			}
		},"myThread--01");
		//set max priority
		t1.setPriority(Thread.MAX_PRIORITY);

		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 100; i++) {
					System.out.println(Thread.currentThread().getName()+"---"+i);
				}

			}
		},"myThread--02");
		//set norm priority
		t2.setPriority(Thread.NORM_PRIORITY);

	Thread t3 = new Thread(new Runnable() {
		@Override
		public void run() {
			for (int i = 0; i < 100; i++) {
				System.out.println(Thread.currentThread().getName()+"---"+i);
			}
		}
	},"myThread--03");
	//set min priority == 1
		t3.setPriority(Thread.MIN_PRIORITY);

		t1.start();
		t2.start();
		t3.start();
	}

而檢視結果時雖然發現myThread--01在開始出現的次數多,但是卻並不如我們所理想中的那樣。