簡體   English   中英

java multithreading - 等待空閑線程可用性來創建和分配下一個任務

[英]java multithreading -Wait for free threads availability to create and assign next task

尋找解決多線程問題的方法。 我有 N 個任務,比如 100。我需要使用有限數量的線程來運行這 100 個任務,比如 4。任務大小很大,所以我不想一起創建所有任務。 只有當池中有空閑線程可用時,才會創建每個任務。 任何推薦的解決方案。

您可以使用BlockingQueue來定義任務。 讓一個線程創建任務並使用put將它們添加到隊列中,它會阻塞直到隊列中有空間。 然后讓每個工作線程從隊列中取出下一個任務。 隊列的阻塞性質基本上會強制第一個線程(即定義任務)不要領先於工作線程太遠。

這實際上只是生產者-消費者模式的一個例子,其中被生產和消費的東西是做一些工作的請求。

一旦所有工作完成,您需要指定某種方式來完成整個事情。 一種方法是在生成線程創建所有任務時將 N 個“毒丸”放在隊列中。 這些特殊任務只是告訴工作線程退出(而不是做一些工作然后要求下一項)。 由於每個線程最多只能讀取一個毒丸(因為它讀取后退出),並且您將 N 個毒丸放入隊列中,因此您將確保您的 N 個線程中的每個線程都只能看到一個毒丸。

請注意,如果任務生成線程消耗資源,例如讀取任務的數據庫連接,則這些資源將被保留,直到所有任務都已生成——這可能需要一段時間! 這通常不是一個好主意,因此在這些情況下這種方法不是一個好方法。

如果可以從線程池中獲取某個時間點的活動線程數,則可以解決您的問題。 為此,您可以使用ThreadPoolExecutor#getActiveCount 獲得活動線程的數量后,您就可以決定是否應該創建任務。

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
executor.getActiveCount();

注意:ExecutorService 不提供getActiveCount方法,你必須使用ThreadPoolExecutor ThreadPoolExecutor#getActiveCount返回正在積極執行任務的線程的approximate數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM