一、創建任務
任務可以理解爲一段獨立執行的代碼,它完成一定的功能。
在Java 5及以上版本中不僅可以利用 Runnable接口,還可以利用Callable接口。
兩種任務的區別:Runnable 的run()方法完成的任務是沒有返回值的 - void
而Callable 的call()方法完成的任務是有返回值的 - 返回值 有接口的泛型<V> 來制定
二、執行任務
通過java.util.concurrent.ExecutorService接口對象來執行任務,
這個接口對象由工具類java.util.concurrent.Executors的靜態方法來創建。
相關類及接口說明:
Executors 提供建立線程池或線程工廠的方法.
ExecutorService 提供了管理終止的方法,以及可爲跟蹤一個或多個異步任務執行狀況而生成 Future 的方法。
Executor 可以簡單理解爲一個線程的執行者,是Executors 的上一級接口。
Callable 線程要執行而去實現的接口
Future 表示異步計算的結果,對執行的線程的狀態檢查,可以獲得執行結果.
下面以一個例子來說明:
查看輸出:
看線程的名字都是類似於“pool-1-thread-4” 的字符串,可是爲什麼最大的索引是5呢?
對了,這裏就與線程池中維護的線程數量有關了 當你改變線程池的大小時,這裏的數據時會跟着變的,
service.submit(Callable callable)是來運行 Callable類型的任務,也可運行Runnable類型的任務
而
service.execute(Runnable runnable)只能用來運行 Runnable類型的任務
注:這個execute方法是其父藉口java.util.concurrent.Execute中的一個方法
大家也可以試試
ExecutorService service = Executors.newCachedThreadPool();
看輸出的名字Thread名字會有什麼變化