线程池:一种线程使用模式。线程过多会带来调度开销。
一池N线程
Executors.newFixedThreadPool(int)
一个任务一个任务执行,一池一线程
Executors.newSingleThreadExecutor()
线程池根据需求创建线程,可扩容,遇强则强
Executors.newCachedThreadPool()
实际开发中不会使用上面三种方式创建
线程池7个参数
线程池的创建底层都是调用了如下方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
各个参数的意思
JDK内置的拒绝策略
自定义线程池
package com.daijunyi.pool;
import java.util.Random;
import java.util.concurrent.*;
public class PoolTest {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
5,
2L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(3),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
try {
for (int i=0;i<20;i++){
threadPoolExecutor.execute(()->{
System.out.println(Thread.currentThread().getName()+"执行");
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(2));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"完成----");
});
}
}finally {
//执行完毕关闭线程池
threadPoolExecutor.shutdown();
}
}
}