一.为什么用线程池
普通的多线程代码 创建线程后代码跑完 线程就会消失 想要创建 还得再次去创建 不仅浪费时间 还浪费资源。
解决方法:创建一个容器线程池,有任务自动开启创建线程去执行任务,执行完毕后再释放回线程池。线程池有上限,可以由自己设置。
二.线程池的核心原理
工具类 executors 创建线程池
代码实现:
public class myrun implements Runnable{
//利用接口 重写方法 里面一个循环 输出线程名字方便查看
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"----"+i);
}
}
}
实现类
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class demo {
public static void main(String[] args) {
ExecutorService poor1= Executors.newCachedThreadPool();
//创建线程池 newCachedThreadpool()不写参数就是无上限
/*写了参数 newCachedThreadpool(3) 就会限制个数
提交任务时 如果没有空闲的线程 就会排队等待
太多了系统会崩溃
* */
poor1.submit(new myrun());
poor1.submit(new myrun());
poor1.submit(new myrun());
poor1.submit(new myrun());
}
}
效果:
自定义线程池:
import java.util.concurrent.*;
public class poor {
public static void main(String[] args) {
ThreadPoolExecutor myp=new ThreadPoolExecutor(
3,/*核心线程数量 能小于0*/
5,/*临时线程数量 不能小于0 最大线程数》=核心线程数量*/
60,/*临时线程销毁时间 超过60秒*/
TimeUnit.SECONDS,/*时间单位*/
new ArrayBlockingQueue<>(3),/*阻塞队列*/
Executors.defaultThreadFactory(),/*创建线程工厂*/
new ThreadPoolExecutor.AbortPolicy()/*超过队列之后的任务拒绝策略*/
);
}
}