我正在創建程式以在執行緒的幫助下并行運行邏輯。邏輯必須在一個串列的回圈中完成,并且該串列可能包含 1000 行要處理,所以我在一個回圈中啟動每個執行緒,一旦執行緒大小達到 5,我將為所有 5 個啟動的執行緒呼叫 thread.join。所以我認為只有在第一組 5 個執行緒完成后才會啟動第二組 5 個執行緒?我的理解正確嗎?我對執行緒有點陌生。
所以我需要在前一組 5 個執行緒中的任何一個完成時啟動第 6 個執行緒。或在前一組執行緒中的任何 2 個完成時開始第 6 和第 7。
我的代碼
public static void executeTest(){
for (int i = 0; i < rows1; i ) {
RunnableInterface task = new New RunnableInterface(params);
Thread thread = new Thread(task);
thread.start();
threads.add(thread);
if ((threads.size() % 5 == 0) || ((i == rows1-1) && (threads.size() < 5))) {
waitForThreads(threads);
}
}
}
private static void waitForThreads(List<Thread> threads) {
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
threads.clear();
}
我需要做什么樣的修改才能達到上述結果
uj5u.com熱心網友回復:
您可以使用ExecutorService無界輸入佇列和固定數量的執行緒,如下所示:
ExecutorService exec = Executors.newFixedThreadPool(5);
// As many times as needed:
for(int i = 0; i< 100_000; i ) {
Runnable myrunnable = () -> {}; // new RunnableInterface(params)
exec.submit(myrunnable);
}
exec.shutdown();
exec.awaitTermination(1, TimeUnit.DAYS);
在 JDK19 中,執行器服務是AutoClosable,因此您可以簡化為:
try (ExecutorService exec = Executors.newFixedThreadPool(5)) {
...
}
uj5u.com熱心網友回復:
如有疑問,請將其分解為更小、更簡單的函式:
public static void executeTest(){
for (int i = 0; i < rows1; i ) {
startFiveThreads(i);
awaitFiveThreads(i);
}
}
private static void startFiveThreads(int i) {
...
}
private static void awaitFiveThreads(int i) {
...
}
不過實話說?我正在為您的問題提供字面答案——一種更好的方式來實施您的解決方案。@DuncG 為您展示了一個更好的解決方案。絕對聽從 DuncG 的說法,但下次你嘗試實作一些棘手/復雜的演算法時,也許記得我說過的話。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/517049.html
標籤:爪哇多线程
上一篇:c中的執行緒安全拆分ip:埠
