1. 程式人生 > >技術複習-java執行緒池

技術複習-java執行緒池

ThreadPoolExecutor

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

引數詳解

  1. corePoolSize 核心執行緒數 當執行緒數<corePoolSize時,新建執行緒。

  2. maxinumPoolSize 最大執行緒數

  3. keepAliveTime 存活時間 當執行緒數>corePoolSize時,空閒執行緒存活的最長時間

  4. timeUnit 單位時間

  5. workQueue 儲存任務的阻塞佇列

  6. threadFactory 執行緒建立工廠

  7. handler 拒絕策略

任務執行順序

  1. 當執行緒數<corePoolSize時,新建執行緒執行任務。
  2. 當執行緒數>corePoolSize,且workQueue未滿的時候,任務加到workQueue中。
  3. 當執行緒數>corePoolSize,且workQueue滿了,且當前執行緒數<maximumPoolSize,則新起執行緒執行。
  4. 當執行緒數>corePoolSize,且workQueue滿了,且當前執行緒數>=maximumPoolSize,則執行拒絕策略

4個預設拒絕策略

拒絕策略預設有4種 1.丟擲異常 2.直接丟棄 3.丟棄佇列中最老的 4.直接呼叫run方法,阻塞執行。 當然也可以繼承RejectedExecutionHandler實現自己的拒絕策略

Executors

因為引數比較多,java中的Exectors提供了簡便的執行緒池建立方式。

1.Executors#newFixedThreadPool(int nThreads) 固定執行緒池
public static ExecutorService newFixedThreadPool(int nThreads) {
		return new ThreadPoolExecutor(nThreads, nThreads,
			 0L, TimeUnit.MILLISECONDS,
			 new LinkedBlockingQueue<Runnable>());
	}

可以看到用的workQueue是LinkedBlockingQueue,說明佇列無限長,執行緒池最大值就是入參nThreads。

2.Executors#newCachedThreadPool() 執行緒池為Integer.MAX_VALUE的執行緒池
public static ExecutorService newCachedThreadPool() {
		return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
		60L, TimeUnit.SECONDS,
		new SynchronousQueue<Runnable>());
	}

SynchronousQueue是容量為1的阻塞佇列,所以新增任務的時候會新起執行緒,執行緒數最大值為Integer.MAX_VALUE

3.Executors#newSingleThreadPool() 執行緒數為1的執行緒池
public static ExecutorService newSingleThreadExecutor() {
		return new FinalizableDelegatedExecutorService
			(new ThreadPoolExecutor(1, 1,
			0L, TimeUnit.MILLISECONDS,
			new LinkedBlockingQueue<Runnable>()));
	}

不用說了,執行緒數最大為1。

TaskFuture

繼承於Future,能夠實現帶返回值的執行緒執行結果。 幾個特殊方法, isDone() get(),get(Long timeOut,TimeUtil