Java執行緒池用法實戰案例分析
阿新 • • 發佈:2020-01-07
本文例項講述了Java執行緒池用法。分享給大家供大家參考,具體如下:
一 使用newSingleThreadExecutor建立一個只包含一個執行緒的執行緒池
1 程式碼
import java.util.concurrent.*; public class executorDemo { public static void main( String[] args ) { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(() -> { String threadName = Thread.currentThread().getName(); System.out.println("Hello " + threadName); }); } }
2 執行
Hello pool-1-thread-1
二 含有終止方法的執行緒池
1 程式碼
import java.util.concurrent.*; public class executorShutdownDemo { public static void main( String[] args ) { ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(() -> { String threadName = Thread.currentThread().getName(); System.out.println("Hello " + threadName); }); try { TimeUnit.SECONDS.sleep(3); System.out.println("嘗試關閉執行緒執行器..."); executor.shutdown(); executor.awaitTermination(5,TimeUnit.SECONDS); } catch (InterruptedException e) { System.err.println("關閉任務被中斷!"); } finally { if (!executor.isTerminated()) { System.err.println("取消未完成的任務"); executor.shutdownNow(); } System.out.println("任務關閉完成"); } } }
2 執行
Hello pool-1-thread-1
嘗試關閉執行緒執行器...
任務關閉完成
3 說明
shutdown只是將執行緒池的狀態設定為SHUTWDOWN狀態,正在執行的任務會繼續執行下去,沒有被執行的則中斷。
shutdownNow則是將執行緒池的狀態設定為STOP,正在執行的任務則被停止,沒被執行任務的則返回。
舉個工人吃包子的例子:一個廠的工人(Workers)正在吃包子(可以理解為任務)。
假如接到shutdown的命令,那麼這個廠的工人們則會把手頭上的包子給吃完,沒有拿到手裡的籠子裡面的包子則不能吃!
而如果接到shutdownNow的命令以後呢,這些工人們立刻停止吃包子,會把手頭上沒吃完的包子放下,更別提籠子裡的包子了。
awaitTermination(long timeOut,TimeUnit unit)
當前執行緒阻塞,直到
- 等所有已提交的任務(包括正在跑的和佇列中等待的)執行完
- 或者等超時時間到
- 或者執行緒被中斷,丟擲InterruptedException
然後返回true。
更多java相關內容感興趣的讀者可檢視本站專題:《Java程序與執行緒操作技巧總結》、《Java資料結構與演算法教程》、《Java操作DOM節點技巧總結》、《Java檔案與目錄操作技巧彙總》和《Java快取操作技巧彙總》
希望本文所述對大家java程式設計有所幫助。