[英]Passing thread priorities to thread pools
我有一個Java組件,它執行一些超級復雜的業務邏輯,其中一些並行化,並且執行子任務的線程被合並。 現在,對此組件的每個請求都可以具有某些優先級,這些優先級以某種方式映射到線程優先級。 在執行的開始,我可以為執行線程分配適當的優先級。 有問題的部分是將優先級傳遞給執行子任務的每個線程。 我知道產生一個新的子線程會實現這一點,因為子線程繼承了父線程的優先級,但我想利用線程池。 一個問題:
干杯。 托梅克
您想要使用線程池,如果您只是為了設置作業優先級而必須生成新線程,這將變得無用。
我想你希望每個工作 (而不是線程 )都有不同的優先級。 如果是這種情況,讓我們看一下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邊界線程很少有好處。
我最近實現了這個。 尼克威吉爾建議,我做得很多。
但是你不能只做他建議的事情,因為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.