目录
1.可以提交任务到线程池,那么就会有一种数据结构来保存我们提交的任务
2.创建线程池是需要指定初始线程数量,这些线程不停的扫描阻塞队列,如果有任务就立即执行
1.线程池是什么?
- 线程池就是用来存放线程的一个池子
- 当程序启动的时候就创建出若干个线程
- 有任务就处理,没有任务就阻塞等待
比如在JDBC编程中,通过DataSource获取Connectoin的时候就已经用到了池的概念
2.为什么要使用线程池?
为了减少系统资源的开销
线程池的作用就是为了减少这些关于申请与释放PCB的操作,尽量保证我们的程序在用户态执行
3.如何使用线程池
1.JDK给我们提供了一些方法来创造线程池
无界队列,指的是对于队列中元素的个数不加以限制,可能会出现内存被消耗殆尽的情况
4.设计模式之工厂模式
1.工厂模式用途
解决构造方法创建对象的不足
5.自定义一个线程池
1.可以提交任务到线程池,那么就会有一种数据结构来保存我们提交的任务
可以用阻塞队列来实现
2.创建线程池是需要指定初始线程数量,这些线程不停的扫描阻塞队列,如果有任务就立即执行
可以用线程池的构造方法,接收要创建线程的数据
3.实现过程
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
public class MyThreadPoll {
//定义一个阻塞队列来存放线程
BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>(3);
//对外提供方法,用来提交任务
public void submit(Runnable runnable) throws InterruptedException {
queue.put(runnable);
}
//构造方法初始化线程
public MyThreadPoll(int compacity){
if(compacity <= 0) {
throw new RuntimeException("初始线程任务不可以小于1");
}
//创建线程不停扫描任务
for (int i = 0; i < compacity; i++) {
Thread thread = new Thread(() -> {
while (true) {
try {
Runnable take = queue.take();
take.run();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//启动线程
thread.start();
}
}
}
6.创建线程池时方法构造的参数及含义?
1.int corePoolSize:核心线程数,创建线程时包含的最小线程数量
int maximumPoolSize: 最大线程数,也叫临时线程数,允许系统可以创建的最多线程数量
long keepAliveTime:临时线程空闲的时长
TimeUnit unit:空闲的时间单位,与keepAliveTime一起使用
BlockingQueue<Runnable> workQueue:用来保存任务的阻塞队列
7.线程池的工作原理?(七个参数是如何搭配使用的)
8.拒绝策略(四种方式)
9.为什么不推荐使用系统自带的线程池?
1.使用了无界队列,可能会有系统资源耗尽的情况
2.临时线程无法控制,也会有系统资源耗尽的情况发生
10.创建线程池时,核心线程数目指定多少合适?