簡體   English   中英

在java預定執行程序服務中處理sleep

[英]handling sleep in java scheduled executor service

我有一個像下面這樣復雜的問題。 - 我們有一個具有大量線程要求的實時系統。 為了優化性能,我們正在考慮以下設計。

  • 創建一個具有最大線程數的線程池執行程序
  • 每個線程用於創建預定的執行程序服務。
  • 現在,根據負載均勻地將任務分配給這些執行器服務

  • 但最大的問題是,如果隊列中的任務之一包含休眠(幾秒),它會在該持續時間內阻塞相應的Schedule executor服務線程,並隨后阻塞該隊列中的所有后續任務。

  • 在這方面,請建議我如何暫停執行睡眠或以某種方式覆蓋睡眠,並重新加入/重新安排任務到隊列。

在此先感謝Seshu

假設我理解你的問題,你的Schedule Executor服務線程有一個截止日期要求,但實際的工作人員可以睡一段未知的時間,可能會導致Schedule Executors的時間丟失。 根據你的描述,我猜你想要的是一個需要睡覺才能實際停止的任務,保存進度信息,然后重新安排自己以便將來重新安排的其余工作。 您必須將其構建到您的應用程序架構中。

或者,您可以讓調度程序線程在其自己的單獨線程中啟動工作任務,讓它們在必要時休眠,一個調度程序線程收集所有工作程序終止。

為了獲得更好的答案,您將不得不提供有關您要完成的內容的更多信息。

睡眠的任務對於在任何類型的有界線程池中運行本質上是不友好的。 睡眠明確地告訴線程它在一段時間內必須什么都不做。

如果可能,將任務分成2個(或更多部分),完全消除睡眠。 獲得上半任務,以適當的延遲安排第二項任務。

如果做不到這一點,您可以考慮稍微增加線程池的大小 - 或者設置一個更大的上限到其大小,或者甚至可以完全取消上限(不推薦用於服務器而不是最終可能有許多客戶端)。

或者,將帶有sleep語句的任務移動到它們自己的Scheduled執行程序中。 然后,他們會相互推遲,但是沒有等待陳述的表現更好的任務將獲得優惠待遇。

暫無
暫無

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

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