1. 程式人生 > >(十二)java併發程式設計--執行緒優先順序

(十二)java併發程式設計--執行緒優先順序

執行緒的優先順序並不能保證現成的執行次序。只不過,優先順序高的執行緒獲取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

我們也可以在編譯器中斷點除錯,在除錯過程中可以除錯的當前執行緒和被掛起的執行緒。

總結:
優先順序高的執行緒不一定執行在前面,只是概率高,優先順序低的也不一定會在後面。感覺有些人生哲理了。