(十二)java併發程式設計--執行緒優先順序
阿新 • • 發佈:2018-12-24
執行緒的優先順序並不能保證現成的執行次序。只不過,優先順序高的執行緒獲取CPU資源的概率較大,優先順序低的也並不是沒有機會執行。
優先順序用1-10的整數表示,數值越大優先順序越高,預設優先順序為5。
在一個執行緒中開啟另外一個執行緒,則新開執行緒稱為該執行緒的子執行緒,子執行緒初始優先順序與父執行緒相同。
如下程式碼中,
package thread_priority;
/**
* Created by fang on 2017/12/3.
* 執行緒優先順序.
* MAX_PRIORITY 10
* NORM_PRIORITY 5
* MIN_PRIORITY 1
* setPriority()方法是設定優先順序.getPriority()是獲取優先順序.
* 不是絕對的優先順序,是概率,優先順序高概率高,但不代表絕對的先後順序.
*/
public class ThreadMain2 {
public static void main(String[] args) throws InterruptedException {
//兩個執行緒沒有任何的優先順序.
MyThread myThread = new MyThread();
Thread proxy = new Thread(myThread,"挨踢1");
MyThread myThread2 = new MyThread();
Thread proxy2 = new Thread(myThread2,"挨踢2" );
//設定優先順序
//會看到proxy2 執行的多,但是並不代表先後順序,proxy也有執行在前面的.
proxy.setPriority(Thread.MIN_PRIORITY);
proxy2.setPriority(Thread.MAX_PRIORITY);
proxy.start();
proxy2.start();
Thread.sleep(100);
myThread.stop();
myThread2.stop();
}
}
package thread_priority;
/**
* Created by fang on 2017/12/3.
*
*/
public class MyThread implements Runnable {
private boolean flag = true;
private int num = 0;
public void run(){
while (flag){
System.out.println(Thread.currentThread().getName() + "-->" + num++);
}
}
public void stop(){
this.flag = !this.flag;
}
}
執行結果如下(一部分執行結果):並不是所有的第二個執行緒都線上程1的輸出之前,但是明顯執行緒2列印的較多,也就是執行緒2
執行的概率較多。
挨踢2-->0
挨踢2-->1
挨踢1-->0
挨踢2-->2
挨踢1-->1
挨踢2-->3
挨踢1-->2
挨踢2-->4
挨踢2-->5
挨踢2-->6
挨踢2-->7
挨踢2-->8
挨踢2-->9
挨踢2-->10
挨踢2-->11
挨踢2-->12
挨踢2-->13
挨踢2-->14
挨踢2-->15
挨踢2-->16
我們也可以在編譯器中斷點除錯,在除錯過程中可以除錯的當前執行緒和被掛起的執行緒。
總結:
優先順序高的執行緒不一定執行在前面,只是概率高,優先順序低的也不一定會在後面。感覺有些人生哲理了。