Java线程池底层原理+简单实现线程池代码

线程池

一、线程池是什么?

类似于数据库的连接池,原理大差不大,提前创建好资源等着被调用,省去了每次使用都要创建新的资源以及销毁资源,提高了响应速度和降低资源消耗,方便统一管理。

二、为什么要使用线程池?

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  • 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
核心点:复用机制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJ5c44mu-1676643901821)(%E6%96%87%E6%A1%A3%EF%BC%9A%E5%A4%9A%E7%BA%BF%E7%A8%8B.note%20%E9%93%BE%E6%8E%A5%EF%BC%9Ahttp://note.youdao.com/noteshare?id=cf6e47f4bb46ff727678f3bfc29117aa#pic_center)]
提前创建好固定的线程一直在运行状态,实现复用 限制线程创建数量

  1. 提前创建好固定的线程一直在运行状态----死循环实现
  2. 提交的线程任务缓存到一个并发队列集合中,交给我们正在运行的线程执行
  3. 正在运行的线程就从队列中获取该任务执行

三、自定义实现线程池

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;
    }
}

总结

对线程池的认知、底层原理、代码实现的一个流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值