簡單明瞭Java執行緒池
阿新 • • 發佈:2021-08-24
執行緒池
執行緒池從功能上來看,就是一個工作管理員。在Java中,Executor介面是執行緒池的根介面,其中只包含一個方法:
void execute(Runnable command); // 執行任務
ExecutorService繼承了Executor介面,提供了一些執行緒池的基礎方法:
void shutdown(); // 關閉執行緒池(不接受新任務,但是舊任務會執行) List<Runnable> shutdownNow(); // 關閉執行緒池,返回待執行任務 boolean isShutdown(); // 執行緒池是否會關閉 boolean isTerminated(); // 關閉之前所有任務是否被關閉。(必須先執行過shutdown) ....
再往下是兩種執行緒池的實現:ThreadPoolExecutor和ForkJoinPool。ThreadPoolExecutor中維護了一個BlockingQueue阻塞佇列儲存所有的待執行任務,而ForkJoinPool中每一個執行緒都有自己的BlockingQueue用來儲存任務。
ThreadPoolExecutor
在ThreadPoolExecutor的構造方法中,需要提供幾個引數:corePoolSize、maximumPoolSize、keepAliveTime、BlockingQueue、RejectedExecutionHandler。其中corePoolSize表示當前執行緒池維護幾個執行緒,maximumPoolSize表示允許的最大執行緒數。keepAliveTime表示如果當前執行緒數在
corePoolSize和maximumPoolSize之間時,允許在多久時間內保持存活等待新任務。BlockingQueue是儲存任務的阻塞佇列,RejectedExecutionHandler是不同的拒絕策略。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), handler); }
- 那麼ThreadPoolExecutor中是如何建立新執行緒呢?