1. 程式人生 > >java多執行緒之執行緒的優先順序

java多執行緒之執行緒的優先順序

在作業系統中,執行緒可以劃分優先順序,優先順序較高的執行緒得到CPU資源較多,也就是CPU優先執行優先順序較高的執行緒物件中的任務(其實並不是這樣)。

在java中,執行緒的優先順序用setPriority()方法就行,執行緒的優先順序分為1-10這10個等級,如果小於1或大於10,則丟擲異常throw new IllegalArgumentException(),預設是5。

public class MyThread1 extends Thread {
	@Override
	public void run() {
		long startTime=System.currentTimeMillis();
		long addResult=0;
		for (int i = 0; i < 1000000; i++) {
			new Random().nextInt();
			addResult+=i;
		}
		long endTime=System.currentTimeMillis();
		System.out.println("thread1 use time--->"+(endTime-startTime));
	}
}
public class MyThread2 extends Thread {
	@Override
	public void run() {
		long startTime=System.currentTimeMillis();
		long addResult=0;
		for (int i = 0; i < 1000000; i++) {
			new Random().nextInt();
			addResult+=i;
		}
		long endTime=System.currentTimeMillis();
		System.out.println("thread2 use time--->"+(endTime-startTime));
	}
}

public class MyThread{
	public static void main(String[] args){
		for (int i = 0; i < 5; i++) {
			MyThread1 t1=new MyThread1();
			t1.setPriority(10);
			t1.start();
			MyThread2 t2=new MyThread2();
			t2.setPriority(1);
			t2.start();
		}
	}
}



從結果中可以發現,也有thread2比thread1先執行完,也就驗證了執行緒的優先順序於程式碼執行順序無關。

public class MyThread{
	public static void main(String[] args){
		for (int i = 0; i < 5; i++) {
			MyThread1 t1=new MyThread1();
			t1.setPriority(6);
			t1.start();
			MyThread2 t2=new MyThread2();
			t2.setPriority(5);
			t2.start();
		}
	}


如果我們把優先順序設定近點的話,發現優先順序較高的執行緒不一定沒一次都執行完,執行緒的優先順序與列印的順序無關,不要將這兩點的關係相關聯,他們的關係是不確定性和隨機性。

執行緒的優先順序仍然無法保障執行緒的執行次序。只不過,優先順序高的執行緒獲取CPU資源的概率較大,優先順序低的並非沒機會執行。