之前看到個問題,如果有3個執行緒,如何保證3個執行緒的執行先後順序。其實實現的方法有很多,這裡主要介紹幾種。
首先,執行緒thread有乙個設定優先順序的屬性priority,預設數值為5,設定的越高優先順序越高,最高為10。但是這裡需要注意的是:
優先順序作用只是表示了執行的概率,也就是說優先順序6的執行緒比5的執行緒概率更高,但不代表一定就優先執行。
(一)首先說下第一種方法,執行緒池executorservice有乙個工廠方法newsinglethreadexecutor(),該方法生成的是單例執行緒,因此如果向其提交執行緒時,先提交的先執行,後提交的執行,以此就能實現執行順序。
**:
executorservice es = executors.newsinglethreadexecutor();
es.submit(new runnable()
});es.submit(new runnable()
});es.submit(new runnable()
});es.shutdown();
結果:c b a
(二)concurrent包裡面有個countdownlatch計數器,這裡面有2個方法:c.countdown():作用是計數器減1,c1.await(),如果計數器暫時沒有到0,則阻塞執行緒。
**:
system.out.println("begin");
countdownlatch c1 = new countdownlatch(1);
countdownlatch c2 = new countdownlatch(1);
countdownlatch call = new countdownlatch(3);
thread t1 = new thread(new runnable() catch (exception e)
}});
thread t2 = new thread(new runnable() catch (exception e)
}});
thread t3 = new thread(new runnable()
});t1.start();
t2.start();
t3.start();
try catch (exception e)
結果 :c b a
(三)柵攔cyclicbarrier
cyclicbarrier同樣也是concurrent包裡的類,有2個建構函式,並且有乙個await()方法,其目的是所有呼叫await()方法的執行緒都會被cyclicbarrier攔截,直到攔截的執行緒數量達到了cyclicbarrier的要求,然後統一一起執行。
**:
public static void main(string args)
es.shutdown();
}}class rclass implements runnable
@override
public void run() catch (interruptedexception e) catch (brokenbarrierexception e)
system.out.println("after:"+count);
}
顯示的結果:
begin:0
begin:1
begin:2
begin:3
after:3
after:0
after:1
after:2
這裡需要注意的是:1、如果執行緒數量小於柵欄設定的數量,則所有執行緒都會一直阻塞;2、如果執行緒的數量大於設定的數量n,則會先把這n個執行緒執行了,剩下的繼續攔截,除非剩下的又能滿足n。從這也可以柵欄的好處,設定的cyclicbarrier 可以重複使用。
多執行緒 執行緒優先順序
目錄 1 執行緒優先順序具有繼承性 2 執行緒優先順序的作用 thread類原始碼中定義 最低優先順序為1 public final static int min priority 1 一般沒有繼承,沒有顯示指定優先順序時,預設優先順序為5 public final static int norm ...
多執行緒 12 優先順序
優先順序 priority 在多個執行緒同時執行時,執行緒的排程器會根據執行緒的優先順序,優先呼叫級別高的執行緒,優先調用不代表絕對的前後順序,執行緒級別高的先呼叫的概率就大,執行緒級別低的先呼叫的概率就小,就相當買彩票,優先順序低的相當買一張彩票,優先順序高的相當於買一百張,所以優先順序只代表乙個...
C 多執行緒 優先順序
在我的公司這裡,因為要跟很多特殊的裝置打交道,所以會用到多執行緒的東西,那麼我們在進行多執行緒處理的時候,怎麼去設定優先順序 執行緒裡有個屬性priority可以用來設定優先順序,我設定執行緒1的優先順序高於執行緒2的優先順序,那麼執行緒1就會比執行緒2多執行一段時間,這個是人眼觀察不出來的 執行速...