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

05-06 09:13