簡體   English   中英

將線程優先級傳遞給線程池

[英]Passing thread priorities to thread pools

我有一個Java組件,它執行一些超級復雜的業務邏輯,其中一些並行化,並且執行子任務的線程被合並。 現在,對此組件的每個請求都可以具有某些優先級,這些優先級以某種方式映射到線程優先級。 在執行的開始,我可以為執行線程分配適當的優先級。 有問題的部分是將優先級傳遞給執行子任務的每個線程。 我知道產生一個新的子線程會實現這一點,因為子線程繼承了父線程的優先級,但我想利用線程池。 一個問題:

  • 有沒有辦法確保執行路徑中的每個線程都具有適當的優先級?
  • 如何在每個執行階段監控線程優先級,當然我不想硬編碼任何跟蹤代碼? 我想到的是在BTrace中編寫一些跟蹤腳本

干杯。 托梅克

您想要使用線程池,如果您只是為了設置作業優先級而必須生成新線程,這將變得無用。

我想你希望每個工作 (而不是線程 )都有不同的優先級。 如果是這種情況,讓我們看一下ThreadPoolExecutor的構造函數簽名:

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,
TimeUnit unit, BlockingQueue<Runnable> workQueue)
  • 不使用推薦的Executors的工廠方法之一來構建線程池,而是使用眾多簽名之一自己創建new ThreadPoolExecutor(...)
  • Executors.defaultThreadFactory傳遞給此構造函數(上面列出的簽名在內部執行此操作)。 這將在創建線程時執行自動線程優先級分配(對於固定大小的線程池,在應用程序啟動時每個線程應該只發生一次)。
  • BlockingQueue<Runnable>PriorityBlockingQueue<Runnable>傳遞給此構造函數。 這是一個隊列,它允許您優先處理作業 (而不是線程 )。
  • Runnable擴展為一個抽象的PriorityRunnable類,允許獲取/設置優先級。 這些代表作業 ,因此當您想要創建一個新作業時,只需擴展它並根據該作業自定義設置優先級。
  • 實現Comparator在將元素插入隊列時對元素執行排序,並讓該隊列使用它。
  • 將您的作業添加到隊列中。

請注意,如果此時已經填充了隊列(例如批處理應用程序),則可以在構造后立即調用executor.prestartAllCoreThreads()executor.prestartCoreThread(n)

這一切都非常簡單,只需要很少的代碼就可以設置。

編輯:剛剛在Java Ranch上發現了相同的方法。

我假設你已經知道這一點,但是JDK Thread的優先級值是否重要是高度特定於操作系統的,並且可能轉化為“無論如何都沒有效果”。 所以你確定它真的很重要嗎? 如果是這樣,可能編輯問題提及系統運行的操作系統。

另外:即使嘗試使用線程優先級也不常見; 除了優先事項不一定有效之外,即使它們有效,也要充分利用它們並非易事。 更常見的是使用同步原語,以及控制並發級別(活動線程數),而不是優先級。 這是因為擁有比核心系統更多的活動CPU邊界線​​程很少有好處。

就設置線程的優先級而言,可以使用Executors類的不同方法來獲取ThreadFactory。 該工廠將負責根據傳入的“Runnable”創建線程。

關於監控,當你說“每個執行階段”時,你能否根據你想要解決的場景進行推斷? 正如其他地方已經提到的那樣 ,由於Java和OS線程優先級之間沒有明確的映射關系,依賴這些優先級將是一件壞事,如果這是你在這里嘗試的。

我最近實現了這個。 尼克威吉爾建議,我做得很多。

但是你不能只做他建議的事情,因為ThreadPoolExecutor不會把你要求的工作放在workQueue中 - 相反,它將它們包裝在自己的RunnableFuture中並將它們放入隊列中。 因此,您必須覆蓋其newTaskFor方法以傳遞優先級。

源代碼在Apache 2.0許可下在線: https//github.com/TheClimateCorporation/claypoole/blob/master/src/java/com/climate/claypoole/impl/PriorityThreadpoolImpl.java

這可以解決您的問題:Thread.currentThread()。setPriority([1..5]);

您可以在任何地方使用它們。 如果在線程池啟動的runnable中使用它們,則可以控制單線程優先級並根據需要進行更改。

暫無
暫無

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

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