做java的開發,線程是經常用的。最簡單的使用大家都應該清楚,如繼承Thread類、實現Runnable接口。這樣,是沒有問題。但是當我們需要頻繁的處理一些任務時候,就要多次創建線程和處理線程關閉等回收工作。 這樣比較麻煩。并且如果同時不限制線程個數,很多個任務一起執行,對性能有一定影響。所以,java提供了Executor線程池來處理并發任務,并且可以支持4種模式:
1.newCachedThreadPool: 創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。 2.newFixedThreadPool:創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。 3.newScheduledThreadPool: 創建一個定長線程池,支持定時及周期性任務執行。 4.newSingleThreadExecutor: 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。
一 創建線程池
// 創建可以容納3個線程的線程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); // 線程池的大小會根據執行的任務數動態分配 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); // 創建單個線程的線程池,如果當前線程在執行任務時突然中斷,則會創建一個新的線程替代它繼續執行任務 ExecutorService singleThreadPool = Executors.newSin // 效果類似于Timer定時器 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);二 啟動線程池
啟動線程提供了2個方法:ExecutorService 的submit() 與execute(),定義如下:
<T> Future<T> submit(Callable<T> var1);<T> Future<T> submit(Runnable var1, T var2);Future<?> submit(Runnable var1);void execute(Runnable var1);三 關閉線程池使用以下的方法: 1.shutdown() 方法: 關閉線程池資源。不再接受新的任務,之前提交的任務等待執行結束再關閉。并且回收資源。 2.shutdownNow(): 立即關閉,通過調用Thread.interrupt來實現線程的立即退出。執行該方法,線程池的狀態立刻變成STOP狀態,并試圖停止所有正在執行的線程,不再處理還在池隊列中等待的任務。并且回收資源。
四 new Thread和線程池創建線程區別
new Thread的弊端如下: a. 每次new Thread新建對象性能差。 b. 線程缺乏統一管理,可能無限制新建線程,相互之間競爭,及可能占用過多系統資源導致死機或oom。 c. 缺乏更多功能,如定時執行、定期執行、線程中斷。 相比new Thread,Java提供的四種線程池的好處在于: a. 重用存在的線程,減少對象創建、消亡的開銷,性能佳。 b. 可有效控制最大并發線程數,提高系統資源的使用率,同時避免過多資源競爭,避免堵塞。 c. 提供定時執行、定期執行、單線程、并發數控制等功能。
新聞熱點
疑難解答