多執行緒設定優先順序方法

2021-09-22 02:17:52 字數 1883 閱讀 2836

之前看到個問題,如果有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多執行一段時間,這個是人眼觀察不出來的 執行速...