ThreadPoolExecutor JDK能够提供的线程池, 大家可以往这个线程池里面扔东西,让它自己去运行,首先看戏如何定义一个线程池:
这里面有7个 参数:
public ThreadPoolExecutor(
int corePoolSize, 核心线程数
int maximumPoolSize, 最大线程数
long keepAliveTime, 生存时间,线程多久没干活请归还操作系统
TimeUnit unit,生存时间的单位
BlockingQueue workQueue, 任务队列
ThreadFactory threadFactory, 线程工厂
RejectedExecutionHandler handler 拒绝策略
) {}
public class ThreadPoolDemo01 {
static class Mytask implements Runnable {
private int i;
@Override
public void run() {
System.out.println("线程名字:" + Thread.currentThread().getName() + " Task i:" + i);
try {
System.in.read(); //线程阻塞在这里
} catch (IOException e) {
e.printStackTrace();
}
}
public Mytask(int i) {
this.i = i;
}
@Override
public String toString() {
return "task{" +
"i=" + i +
'}';
}
}
public static void main(String[] args) {
//顺序:先执行 核心线程-任务队列-最大线程-拒绝策略
ThreadPoolExecutor tpe = new ThreadPoolExecutor(
2, //核心线程数
4, //最大线程数
60, //生存时间,线程很长时间没干活,请归还给操作系统
TimeUnit.SECONDS, //生存时间的单位
new ArrayBlockingQueue<>(4), //任务队列
Executors.defaultThreadFactory(),//线程工厂
new ThreadPoolExecutor.CallerRunsPolicy()); //拒绝策略
for (int i = 0; i < 7; i++) {
tpe.execute(new Mytask(i));
}
System.out.println("任务队列:" + tpe.getQueue());
// tpe.execute(new Mytask(100));
//System.out.println(tpe.getQueue());
tpe.shutdown();
}
}
执行顺序:
首先,线程先上来,看下要求的核心线程数,核心线程没满的话,直接运行,如果核心线程已满,放到等待队列里面,如果等到队列也满了,就直接运行,直到总运行数达到最大线程数为止,如果等待队列和最大线程都满了,则执行拒绝策略