线程池
一、线程池是什么?
类似于数据库的连接池,原理大差不大,提前创建好资源等着被调用,省去了每次使用都要创建新的资源以及销毁资源,提高了响应速度和降低资源消耗,方便统一管理。
二、为什么要使用线程池?
- 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
- 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
- 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
核心点:复用机制
提前创建好固定的线程一直在运行状态,实现复用 限制线程创建数量
- 提前创建好固定的线程一直在运行状态----死循环实现
- 提交的线程任务缓存到一个并发队列集合中,交给我们正在运行的线程执行
- 正在运行的线程就从队列中获取该任务执行
三、自定义实现线程池
public class MyExecutors {
public static void main(String[] args) {
MyExecutors myExecutors=new MyExecutors(2,20);
for (int i = 0; i < 10; i++) {
int finalI = i;
myExecutors.excute(new Thread(()->{
System.out.println(Thread.currentThread().getName()+","+ finalI);
}));
}
//停止线程所有任务
myExecutors.remove();
}
//存储队列
private static ArrayBlockingQueue<Runnable> arrayBlockingQueue;
private static boolean isRun=true;
/**
* 最大线程数,队列数量
*/
public MyExecutors(int maxThreadCount,int MaxQueue){
//初始化最大队列值
arrayBlockingQueue = new ArrayBlockingQueue<Runnable>(MaxQueue);
//初始化核心线程数开启一直运行
for (int i = 0; i < maxThreadCount; i++) {
new MyThread().start();
}
}
/**
* 内部线程类
*/
static class MyThread extends Thread{
@Override
public void run() {
//执行完队列中的任务才会停止线程池
while (isRun || arrayBlockingQueue.size()>0){
//取队列值进行执行
Runnable runnable = arrayBlockingQueue.poll();
if(runnable!=null){
//开启线程任务
runnable.run();
}
}
}
}
public boolean excute(Runnable runnable){
return arrayBlockingQueue.offer(runnable);
}
public void remove(){
isRun=false;
}
}
总结
对线程池的认知、底层原理、代码实现的一个流程。