ThreadPoolExecutor的参数:
int coreSize, 核心线程
int maxSize,最大线程
long time,空闲线程超时时间, 超时后销毁
TimeUnit ,空闲时间单位
BlockingQueue taskQueue,存放任务的队列,
ThreadFactory threadFactory) 创建线程的线程工厂
当有新的任务时:
a. 如果此时线程数小于核心线程, 那么将会创建一个线程
b. 如果此时线程数大于等于核心线程,且没有空闲线程, 那么任务将会放在队列中
c. 如果此时线程数大于等于核心线程,且没有空闲线程,队列已满, 将会创建新的线程
d. 如果此时队列已满且线程数等于最大线程, 那么抛出异常, 任务提交失败
核心线程是否销毁取决于 设置 quitCore , true则不会销毁
线程池的四种类型:
1. newCachedThread Pool 可缓存线程池
new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L , TimeUnit.SECONDS,
new SynchronousQueue());
特点: 没有核心线程, 最大线程为无限大, 所有线程空闲60s销毁,
SynchronousQueue容量为0,所有任务会立即被执行
2. newFixedThreadPool 定长线程池, 可控制线程最大并发数, 超出的线程会在队列中等待
new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
特点:只有核心线程, 由参数确定核心线程数, 超出的任务会在队列中等待
3. newScheduledThreadPool 定长线程池, 支持定时及周期性任务执行
super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS, new DelayedWorkQueue());
DelayedWorkQueue队列, 可延时执行阻塞任务的队列和LinkedBlockingQueue是兄弟关系
4. newSingleThreadExecutor 单线程化的线程池, 使用唯一的工作线程来执行任务, 保证所有任务先进先出的执行顺序
ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()
线程之间的通信方式:
- volatile, Synchronized , ReentrantLock
- wait / notify
- 管道输入输出流
- Thread.join()
- ThreadLocal