大家好,又见面了,我是你们的朋友全栈君。
线程池在面试、开发过程中都比较重要。本文总结了一些关于该方面的相关知识点。 以下内容收集于 蚂蚁课堂
线程池和数据库连接池非常类似,可以统一管理和维护线程,减少没有必要的开销。
因为在项目开发过程中频繁的开启线程或者停止线程,线程需要重新被CPU从就绪状态调度到运行状态,需要发生CPU的上下文切换,效率非常低。
线程的生命周期如下图所示:
分为以下几种创建方式:
本质思想:创建一个线程,不会立马体质或者销毁,而是一直实现复用。
线程池核心点:复用机制
简单实现代码如下:
/** * @author zfl_a * @date 2021/3/20 * @project multi-thread */
public class CustExcutors {
// 存放线程任务
public BlockingDeque<Runnable> runnableList ;
// 停止线程标识位
private volatile Boolean isRun = true ;
/** * 初始化 * @param dequeSize 队列容器大小 * @param threadCount 线程池大小 */
public CustExcutors(int dequeSize,int threadCount){
runnableList = new LinkedBlockingDeque<>(dequeSize);
for (int i=0;i<threadCount;i++) {
WorkThread workThread = new WorkThread();
workThread.start();
}
}
public void execute(Runnable runnable){
runnableList.offer(runnable);
}
class WorkThread extends Thread {
@Override
public void run (){
// 标识位位true 或者队列中有未执行完成的任务
while(isRun || runnableList.size()>0) {
Runnable runnable = runnableList.poll();
// 如果不为空 ,执行
if(runnable!=null) {
runnable.run();
}
}
}
}
public static void main(String[] args) {
CustExcutors custExcutors = new CustExcutors(10,2);
for (int x=0;x<10;x++) {
final int i = x ;
custExcutors.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"----"+i);
}
});
}
// 停止线程
custExcutors.isRun=false;
}
}
运行结果:只有两个线程在运行任务
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/141560.html原文链接:https://javaforall.cn