Executor 是 java 5 帶進來的, 這套機制稱之爲執行框架,圍繞着 Executor 接口和它的子類接口 ExecutorService 以及實現這個兩個接口的
ThreadPoolExecutor展開的java
Executors 建立 執行器框架
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
方法:線程
executor.getPoolSize(); //返回線程池的大小 executor.getActiveCount(); //返回正在執行的任務的線程數。 executor.getCompletedTaskCount(); //返回已經完成的任務任務數。 executor.getLargestPoolSize(); //返回曾同時位於線程池中的最大線程數。 /* 當即關閉。 1.再也不執行那等待的線程 2.返回等待執行的線程列表 3.正在運行的線程將繼續運行 */ executor.shutdownNow(); /* 若是調用了shutdownNow() 或 shutdown() 方法 ,並執行器完成 關閉過程,將返回true 表示線程池中已經要運行的任務了,也沒有等待的任務。 */ executor.isTerminated(); /* 若是調用了shutdown() 方法 ,將返回true 可能,線程池中還有正在運行的任務,和等待的任務 */ executor.isShutdown(); //將等線程池中已經提交的任務完成。會拒絕以後提交的任務,但正在運行的,和等待的任務將繼續 executor.shutdown(); //當前線程將阻塞5秒。等待線程池中的任務結束。有可能過了5秒後線程池中的任務也還未結束 //返回一個布爾值,true 表示與 isTerminated 的狀況同樣 executor.awaitTermination(5, TimeUnit.SECONDS); //暫停線程池中的全部任務(包含正在執行中的任務和未執行的任務)。立刻關閉線程池 executor.shutdownNow();
單個線程執行器code
executor = (ThreadPoolExecutor) Executors.newSingleThreadExecutor();
固定大小的執行器2接口
executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(5);
運行多個任務並處理第一個結果get
/* invokeAny 方法接收多個線程運行,並返回第一個完成任務而且沒有拋出異常的任務執行結果 */ executor.invokeAny(Collections.emptyList());
運行多個任務,並處理全部結果it
//發送一個線程列表給執行器,並等待列表中全部任務執行完成。 executor.invokeAll(Collections.emptyList());
延時執行任務io
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = (ScheduledThreadPoolExecutor) Executors.newScheduledThreadPool(5); //線程池的大小爲5 scheduledThreadPoolExecutor.schedule(() -> { }, 1, TimeUnit.SECONDS); //將延時一秒後執行任務。
若是想要在某個時間點執行,那就要本身去計算當前時間與要預期時間的差值class
週期性的執行任務List
scheduledThreadPoolExecutor.scheduleAtFixedRate(()->{},1,2,TimeUnit.SECONDS);
1 表示 任務將在 1秒後執行
2 表示 兩個任務執行間隔週期爲 2 秒
說明,雖然兩個任務的間隔爲 2 秒,但若是上一個線程的執行時間大於2秒。那麼就有可能存在兩個或多個線程並存
scheduledThreadPoolExecutor.scheduleWithFixedDelay(()->{},1,2,TimeUnit.SECONDS);
2 表示 上一個任務的結束時間 到下一個任務的開始時間的間隔。 說明,這個狀況下。就不會存在上一個任務與下一個任務並存的狀況