技術複習-java線程池

ThreadPoolExecutor

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

參數詳解

  1. corePoolSize 核心線程數 當線程數<corePoolSize時,新建線程。java

  2. maxinumPoolSize 最大線程數線程

  3. keepAliveTime 存活時間 當線程數>corePoolSize時,空閒線程存活的最長時間code

  4. timeUnit 單位時間繼承

  5. workQueue 保存任務的阻塞隊列隊列

  6. threadFactory 線程建立工廠get

  7. handler 拒絕策略it

任務執行順序

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

4個默認拒絕策略

拒絕策略默認有4種 1.拋出異常 2.直接丟棄 3.丟棄隊列中最老的 4.直接調用run方法,阻塞執行。 固然也能夠繼承RejectedExecutionHandler實現本身的拒絕策略io

Executors

由於參數比較多,java中的Exectors提供了簡便的線程池建立方式。thread

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) cancel(),isCancel()

相關文章
相關標籤/搜索