簡體   English   中英

如何讓線程池中的正在運行的任務讓給當前排隊的另一個任務?

[英]How do I have a running task in a thread pool yield to another task that's currently queued?

我有一個任務做一些工作,然后遞歸調用自己:

void taskA() {
    // logic
    Future future = pool.submit( () -> taskA() );
    // logic (block on future.get())
}

我將遞歸調用提交給線程池(大小 1),此時正在運行的任務被阻塞,因為排隊的調用沒有機會運行。 有沒有辦法讓 ExecutorService 讓其線程暫時擱置阻塞的任務,以允許排隊的任務在其位置運行?

您應該重構代碼以使用 CompletableFuture 以及我們通常所說的延續模式。

而不是使用 Future.get,您應該使用 CompletableFuture 並在 CompletableFuture.thenRun 和朋友中調用取決於 Future.get 的結果的代碼。

你也可以看看 ForkJoinPool。 它適用於一起協作並且可以相互依賴的任務。

ThreadPoolExecutor 不是為這種用途而設計的。 它是為大多數相互獨立的任務而設計的。 這不是禁止的,但是正如您所見,如果您的池沒有足夠的線程,您可以快速鎖定自己。 如果您想繼續以您在示例中所做的方式使用 ThreadPoolExecutor,您必須至少擁有盡可能多的線程,因為可能存在遞歸。

暫無
暫無

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

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