慕田峪9158850
2022-10-13 11:11:48
一個交易清算處理,里面有n(10)個線程,現在需要實現以下功能,n(10)個線程中,n-4(6)個線程全部同時執行完成后,再執行剩下的4個線程。
3 回答

慕的地10843
TA貢獻1785條經驗 獲得超8個贊
用CountDownLatch計數執行就可以。
由于是清算業務,涉及數據庫操作。傻一點的辦法就寫兩份代碼,一份代碼跑4個線程,每次執行都檢查那6個線程的數據庫操作是否完成,然后再執行。

藍山帝景
TA貢獻1843條經驗 獲得超7個贊
有多個方法可以解決,比較方便的辦法有三種:
1、采用CountDownLatch
CountDownLatch latch=new CountDownLatch(n-4);
聲明之后,將latch塞給n-4個線程,然后讓每個線程run方法的最后,都執行latch.countDown(),當n-4個線程都執行完時,latch的計數器也被減為0了,此時即一起完成了。然后再將latch賦值為new CountDownLatch(4),將剩余的線程啟動即可。
2、采用CyclicBarrier
邏輯與上面一樣
3、采用future
也一樣,取出n-4個線程,構建成n-4個future,扔入多線程執行器執行,然后遍歷執行future.get(xxxx)函數去同步獲取響應。當n-4個線程都執行完時,獲取響應的過程也就結束了。然后再執行下面的四個。同理。

婷婷同學_
TA貢獻1844條經驗 獲得超8個贊
或者先把 n-4個線程先放到一個list A中,把另外4個放到另一個listB中.先執行list A中的所有線程,當A執行完最后一個時(可以通過計數器等實現),開始執行B中的線程.
添加回答
舉報
0/150
提交
取消