目录
池化思想
线程池、字符串常量池、数据库连接池
不使用线程池
1、手动创建线程对象
2、执行任务
3、执行完毕,释放线程对象
创建线程池
线程池的优点
-
提高线程的利用率
-
提高程序的响应速度
-
便于统一管理
-
可以控制最大的并发数(设置线程池的参数来确定线程池的容量)
线程池的基本原理
原理: 先创建线程对象(n)放到线程池中,当来的资源数(m)大于 线程数时,后面的(m-n)个资源放到等待队列(也有长度限制) 里面,当等待队列也满时,再来资源线程池会启动应急处理,创建 新的线程对象,当创建的线程对象为线程池最大限制时,再来的资 源会被拒绝,,当线程请求量不大时,创建的线程对象会被关闭, (存活时间)
代码实现
1.核心线程数
2.最大线程容量
3.存活时间
4.时间单位
5.等候队列容量
6.处理操作
import java.util.concurrent.*; import static java.lang.Compiler.command; public class Main { public static void main(String[] args) { ExecutorService executorService = new ThreadPoolExecutor(3, 5, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); for (int i = 0; i < 8; i++){ executorService.execute(()->{ System.out.println(Thread.currentThread().getName()+"===>正在处理"); }); } executorService.shutdown(); } }
当线程数 > 最大线程容量 + 等候队列最大容量 (9 > 5 + 3)
import java.util.concurrent.*; import static java.lang.Compiler.command; public class Main { public static void main(String[] args) { ExecutorService executorService = new ThreadPoolExecutor(3, 5, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); for (int i = 0; i < 9; i++){ executorService.execute(()->{ System.out.println(Thread.currentThread().getName()+"===>正在处理"); }); } executorService.shutdown(); } }
会直接抛异常