我需要運行大量的短期任務。我使用ThreadPoolTaskExecutor
,但我需要在運行時自動更改最小/最大線程池大小。怎麼做?哪個Java線程池執行器用於輕鬆調整池大小?
我現在使用外部AtomicInteger變量,並在提交之前增加它,並在lambda回調中減少它。我可以以某種方式跳過它嗎?只需使用線程池執行程序,而不用做其他任何事情?
我看過很多文章,人們不建議這樣做,我的解決方案好嗎,還是我可以簡化它?我用春天,可能我可以用那裏的東西?
我需要運行大量的短期任務。我使用ThreadPoolTaskExecutor
,但我需要在運行時自動更改最小/最大線程池大小。怎麼做?哪個Java線程池執行器用於輕鬆調整池大小?
我現在使用外部AtomicInteger變量,並在提交之前增加它,並在lambda回調中減少它。我可以以某種方式跳過它嗎?只需使用線程池執行程序,而不用做其他任何事情?
我看過很多文章,人們不建議這樣做,我的解決方案好嗎,還是我可以簡化它?我用春天,可能我可以用那裏的東西?
從API doc of ThreadPoolExecutor:
(...)最典型的是,核心和最大池大小僅在 建設集,但它們也可以使用 setCorePoolSize(int)和setMaximumPoolSize動態改變(INT )。
因此,如果確實需要在運行時修改這些參數,請實例化一個ThreadPoolExecutor
並根據需要對其進行配置。
但是,在你需要動態線程池之前,你應該三思。通常,如果你的任務沒有綁定到任何其他資源而是CPU,那麼擁有比處理器更多的線程是不利的。
那麼爲什麼不使用Runtime.getRuntime().availableProcessors()
作爲近似值呢?
如果我瞭解它,當任務開始時,您要求池創建一個新線程(增加池大小),並要求它在任務結束時關閉一個線程(減小池大小) - 請使用糾正我,如果我誤解你了!
這就是你在做什麼我會考慮放棄這種方法,只是'讓池是'。創建線程並不便宜,我假設你的任務可以一次又一次地重複使用相同的線程(這是池的用途)。一個好的方法是按照isnot2bad的建議將線程數設置爲處理器的數量。
現在我想我更瞭解您的問題。鑑於這種描述,我認爲每個工人有一個ThreadPoolExecutor是一個很好的方法:
// Worker 1 //
int w1ThPoSize = 5; // Initially 5 threads are assigned to worker 1
ThreadPoolExecutor w1ThPo =
new ThreadPoolExecutor(w1ThPoSize,
w1ThPoSize,
0, // No excess threads, so keep alive time is not relevant
TimeUnit.MILLISECONDS, // keep alive time is 0, so no relevant
new LinkedBlockingQueue<Runnable>());
// Sending a task for worker 1
w1ThPo.execute(() -> { System.out.println("I'm running"); });
// Resizing worker 1 thread pool
w1ThPoSize = 10;
w1ThPo.setCorePoolSize(w1ThPoSize);
w1ThPo.setMaximumPoolSize(w1ThPoSize);
// (similar approach for remaining workers)
// When done, remember to shutdown thread pools!
w1ThPo.shutdown();
謝謝你的答覆球員,讓我來描述它更詳細。我有f。即5名工人。工人 - 是一個合乎邏輯的工作單位。我的PM想要有4個worker1線程,3個worker2線程,等等。而且他還希望能夠在運行時更改每個工作人員的最大線程數。所以我想使用5個線程池並分別調整每個線程的線程數。你覺得我可以做得更好嗎?謝謝 – avalon