ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1,
10, 0, TimeUnit.SECONDS,
//new LinkedBlockingQueue<Runnable>()
new ArrayBlockingQueue<Runnable>(100)
,new ThreadPoolExecutor.DiscardOldestPolicy());
参数列表:
corePoolSize(线程池的基本大小)
maximumPoolSize(线程池最大大小)
workQueue任务队列
Policy线程池饱和策略
1、核心线程创建之后常驻,不会销毁,有任务进来,会一直创建核心线程
2、最大线程:线程池允许创建的最大线程数,如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务,一定要注意,队列满了之后才会创建到最大线程数
3、任务队列有以下几种
ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法 Executors.newCachedThreadPool使用了这个队列。
PriorityBlockingQueue:一个具有优先级的无限阻塞队列。
4、饱和策略:
AbortPolicy:直接抛出异常。
CallerRunsPolicy:只用调用者所在线程来运行任务。
DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
DiscardPolicy:不处理,丢弃掉。
如下代码:只有超过100,才会创建新的非核心线程。
for (int i=0 ;i<150;i++){
threadPoolExecutor.submit(new Task(i));
}