就像数据库连接池一样,为了更合理的利用资源,更方便的管理资源。
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
//自定义线程池
public class MyThreadPool {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,//核心线程数,不会被销毁,维持线程池
4,//最大线程数,核心线程数不够用的时候会新建线程,直到这个值
60,//线程存活时间(非核心线程持续无任务状态这么久,被销毁)
TimeUnit.SECONDS,//存活时间单位
new ArrayBlockingQueue<Runnable>(4),//任务队列 可以是其他类型的BlockingQueue
Executors.defaultThreadFactory(),//线程工厂,创建线程
new ThreadPoolExecutor
//拒绝策略 当线程池忙且线程队列满的情况下,执行该策略
//拒绝策略可自定义
//jdk中有4种
// .AbortPolicy()//抛异常
// .DiscardPolicy() //不接收新任务
.DiscardOldestPolicy()//去掉最老的任务(最前的任务最老),插入新任务
// .CallerRunsPolicy()//调用者处理任务
);
for (int i = 0; i < 8; i++) { //最大线程4+队列4 正好8个不会报错
threadPoolExecutor.execute(new MyTask(i));
}
System.out.println(threadPoolExecutor.getQueue());//查看队列
threadPoolExecutor.execute(new MyTask(666));
System.out.println(threadPoolExecutor.getQueue());//搭配DiscardOldestPolicy查看666号任务替换了最后一个任务
}
static class MyTask implements Runnable {
private int i;
public MyTask(int i) {
this.i = i;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " --- " + i);
try {
System.in.read();//要让线程阻塞住,为了试验策略规则
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public String toString() {
return "Task{" +
"i=" + i +
'}';
}
}
}