Java線程池在使用中的問題解疑
Java線程池需要我們不斷的學習,其實我們在使用的時候還是有不少問題需要我們解決。我們實現了一個簡單的Java線程池。現在我們就可以使用它了,下面的代碼做了一個簡單的示例:
Java代碼
- public class SimpleTaskTest extends Task {
- @Override
- public void deal() {
- // do something
- }
- public static void main(String[] args) throws InterruptedException {
- ThreadPoolService service = new ThreadPoolService();
- service.start();
- // 執行十次任務
- for (int i = 0; i < 10; i++) {
- service.runTask(new SimpleTaskTest());
- }
- // 睡眠1秒鐘,等待所有任務執行完畢
- Thread.sleep(1000);
- service.stop();
- }
- }
- public class SimpleTaskTest extends Task {
- @Override
- public void deal() {
- // do something
- }
- public static void main(String[] args) throws InterruptedException {
- ThreadPoolService service = new ThreadPoolService();
- service.start();
- // 執行十次任務
- for (int i = 0; i < 10; i++) {
- service.runTask(new SimpleTaskTest());
- }
- // 睡眠1秒鐘,等待所有任務執行完畢
- Thread.sleep(1000);
- service.stop();
- }
- }
當然,我們實現的是最簡單的,這里只是為了演示Java線程池的實現原理。在實際應用中,根據情況的不同,可以做很多優化。比如:
調整任務隊列的規則,給任務設置優先級,級別高的任務優先執行。
動態維護Java線程池,當待執行任務數量較多時,增加線程的數量,加快任務的執行速度;當任務較少時,回收一部分長期閑置的Java線程池,減少對系統資源的消耗。
事實上Java5.0及以上版本已經為我們提供了線程池功能,無需再重新實現。這些類位于java.util.concurrent包中。
Executors類提供了一組創建Java線程池對象的方法,常用的有一下幾個:
Java代碼
- public static ExecutorService newCachedThreadPool() {
- // other code
- }
- public static ExecutorService newFixedThreadPool(int nThreads) {
- // other code
- }
- public static ExecutorService newSingleThreadExecutor() {
- // other code
- }
- public static ExecutorService newCachedThreadPool() {
- // other code
- }
- public static ExecutorService newFixedThreadPool(int nThreads) {
- // other code
- }
- public static ExecutorService newSingleThreadExecutor() {
- // other code
- }
newCachedThreadPool()方法創建一個動態的線程池,其中線程的數量會根據實際需要來創建和回收,適合于執行大量短期任務的情況;newFixedThreadPool(int nThreads)方法創建一個包含固定數量線程對象的Java線程池,nThreads代表要創建的線程數,如果某個線程在運行的過程中因為異常而終止了,那么一個新的線程會被創建和啟動來代替它;而newSingleThreadExecutor()方法則只在線程池中創建一個線程,來執行所有的任務。
【編輯推薦】