ThreadPoolExecutor 源码解析(含流程图)

本文章欢迎转载,但是转载请标明出处。程序锋子https://blog.csdn.net/l13591302862/article/details/113741734

前言

线程池大家都用过,但是线程池的内部源码,大家可能不太了解。没了解过源码的小伙伴可以通过该文章了解,了解过的也可以先思考下了解到什么程度,然后再和本文进行对比,可能会有新的理解。
本文大纲

手写简易线程池

为了更好地理解线程池,手写了一个简单的线程池。同样使用阻塞队列,线程数量是固定的,线程池创建时就创建和运行所有线程。虽然和 ThreadPoolExecutor 相比差很低,但是也达到复用线程的目的,核心思想不变,都是生产者消费者模型

public class MyThreadPool implements Executor {
   

    /**
     * Worker 列表
     */
    private List<Worker> workers;

    /**
     * 任务阻塞队列
     */
    private final BlockingQueue<Runnable> tasks = new LinkedBlockingQueue<>();

    private final static int NCPU = Runtime.getRuntime().availableProcessors();

    /**
     * 核心线程数量
     */
    private final int coreSize;

    /**
     * 线程工厂
     */
    private final ThreadFactory threadFactory;

    /**
     * 终止标志
     */
    private volatile boolean terminated;

    private static final ThreadFactory DEFAULT_THREAD_FACTORY = new ThreadFactory() {
   

        private final AtomicInteger counter = new AtomicInteger();

        @Override
        public Thread newThread(Runnable r) {
   
            return new Thread(r, "default-pool-" + counter.getAndIncrement());
        }
    };

    public MyThreadPool() {
   
        this(NCPU, DEFAULT_THREAD_FACTORY);
    }

    public MyThreadPool(int coreSize, ThreadFactory threadFactory) {
   
        checkParameter(coreSize, threadFactory);
        this.coreSize = coreSize;
        this.threadFactory = threadFactory;
        init();
    }

    private void checkParameter(int coreSize, ThreadFactory threadFactory) {
   
        if (coreSize <= 0) {
   
            throw new IllegalArgumentException("coreSize must more than zero");
        }
        if (threadFactory == null) {
   
            throw new NullPointerException("threadFactory cant be none");
        }
    }

    private void init() {
   
        workers = new ArrayList<>(coreSize);
        for (int i = 0; i < coreSize; i++) {
   
            workers.add(new Worker());
        }
    }

    public void stop() {
   
        terminated = true;
        invokerAllThreadInterrupt();
    }

    private void invokerAllThreadInterrupt() {
   
        for (Worker worker : workers) {
   
            worker.thread.interrupt();
        }
    }

    @Override
    public void execute(Runnable command) {
   
        try {
   
            tasks.put(command);
        } catch (InterruptedException e) {
   
            e.printStackTrace();
        }
    }

    private
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值