2015-05-22 89 views
2

我需要運行大量的短期任務。我使用ThreadPoolTaskExecutor,但我需要在運行時自動更改最小/最大線程池大小。怎麼做?哪個Java線程池執行器用於輕鬆調整池大小?

我現在使用外部AtomicInteger變量,並在提交之前增加它,並在lambda回調中減少它。我可以以某種方式跳過它嗎?只需使用線程池執行程序,而不用做其他任何事情?

我看過很多文章,人們不建議這樣做,我的解決方案好嗎,還是我可以簡化它?我用春天,可能我可以用那裏的東西?

回答

2

API doc of ThreadPoolExecutor

(...)最典型的是,核心和最大池大小僅在 建設集,但它們也可以使用 setCorePoolSize(int)和setMaximumPoolSize動態改變(INT )。

因此,如果確實需要在運行時修改這些參數,請實例化一個ThreadPoolExecutor並根據需要對其進行配置。

但是,在你需要動態線程池之前,你應該三思。通常,如果你的任務沒有綁定到任何其他資源而是CPU,那麼擁有比處理器更多的線程是不利的。

那麼爲什麼不使用Runtime.getRuntime().availableProcessors()作爲近似值呢?

0

如果我瞭解它,當任務開始時,您要求池創建一個新線程(增加池大小),並要求它在任務結束時關閉一個線程(減小池大小) - 請使用糾正我,如果我誤解你了!

這就是你在做什麼我會考慮放棄這種方法,只是'讓池是'。創建線程並不便宜,我假設你的任務可以一次又一次地重複使用相同的線程(這是池的用途)。一個好的方法是按照isnot2bad的建議將線程數設置爲處理器的數量。

+0

謝謝你的答覆球員,讓我來描述它更詳細。我有f。即5名工人。工人 - 是一個合乎邏輯的工作單位。我的PM想要有4個worker1線程,3個worker2線程,等等。而且他還希望能夠在運行時更改每個工作人員的最大線程數。所以我想使用5個線程池並分別調整每個線程的線程數。你覺得我可以做得更好嗎?謝謝 – avalon

0

現在我想我更瞭解您的問題。鑑於這種描述,我認爲每個工人有一個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();