线程池讲解第一回

线程池讲解第一回 孟达手写线程池 街球王伟夜战叔弘

简单的线程池实现

public class ThreadPoolTrader implements Executor {

    private final AtomicInteger ctl = new AtomicInteger();

    private volatile int corePoolSize;
    
    private volatile int maximumPoolSize;

    private final BlockingQueue<Runnable> workQueue;
    /**
     * @Description: 构造函数
     * @Author: zhy
     * @Date: 2021/7/21 9:53
     * @Param:  [corePoolSize, maximumPoolSize, workQueue]
     * @return:
     */
    public ThreadPoolTrader(int corePoolSize,int maximumPoolSize,BlockingQueue<Runnable> workQueue) {
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
    }

    /**
     * @Description: 执行任务
     * @Author: zhy
     * @Date: 2021/7/19 15:22
     * @Param:  [command]
     * @return: void
     */
    @Override
    public void execute(Runnable command) {
        int c = ctl.get();
        if (c<corePoolSize) {
            if (!addWorker(command)) {
                reject();
            }
            return;
        }
        // 放入队列中
        if (!workQueue.offer(command)) {
            if (!addWorker(command)) {
                reject();
            }
        }
    }
    /**
     * @Description: 判断线程,加入队列
     * @Author: zhy
     * @Date: 2021/7/21 9:47
     * @Param:  [firstTask]
     * @return: boolean
     */
    private boolean addWorker(Runnable firstTask) {
        if (ctl.get()>=maximumPoolSize) return false;

        Worker worker = new Worker(firstTask);
        worker.thread.start();
        ctl.incrementAndGet();
        return true;
    }
    /**
     * @Description: 工作类
     * @Author: zhy
     * @Date: 2021/7/21 9:47
     * @Param:   * @param null
     * @return:
     */
    private final class Worker implements Runnable {
        final Thread thread;
        Runnable firstTask;

        public Worker(Runnable firstTask) {
            this.thread = new Thread(this);
            this.firstTask = firstTask;
        }

        @Override
        public void run() {
            Runnable task = firstTask;
            try {
                while (task!=null || (task = getTask())!=null) {
                    task.run();
                    if (ctl.get() > maximumPoolSize) {
                        break;
                    }
                    task = null;
                }
            } finally {
                ctl.decrementAndGet();
            }

        }
        /**
         * @Description: 获取队列中任务
         * @Author: zhy
         * @Date: 2021/7/21 9:50
         * @Param:  []
         * @return: java.lang.Runnable
         */
        private Runnable getTask() {
            for (;;) {
                try {
                    System.out.println("workQueue.size: "+workQueue.size());
                    // 取出线程
                    return workQueue.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * @Description: 拒绝服务
     * @Author: zhy
     * @Date: 2021/7/21 9:52
     * @Param:  []
     * @return: void
     */
    private void reject(){
        throw new RuntimeException("Error! ctl.count:"+ctl.get()
                +" workQueue.size: "+workQueue.size());
    }

    public static void main(String[] args) {
        ThreadPoolTrader threadPool = new ThreadPoolTrader(2, 2, new ArrayBlockingQueue<>(10));
        for (int i = 0; i < 10; i++) {
            int finalI = i;
            threadPool.execute(()->{
                try {
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("任务编号: "+finalI);
            });
        }
    }
}
总结 :

AtomicInteger ctl:记录线程池中线程数量;

int corePoolSize: 核心线程数,同时执行的线程数。

int maximumPoolSize:最大的线程数,线程池中可以存在的最多的任务线程数量。

BlockingQueue workQueue :存储任务的队列

execute():执行线程的任务的方法。

1. 判断是否大于corePoolSize,如果corePoolSize,执行addWorker()。addWorker()执行返回true,说明当前任务已经被执行,返回false,说明线程池中的数量已经超出最大的数量了;
2. 向线程池中的队列增加任务,如果增加成功,服务执行完成。如果增加失败,则执行addWorker(),再判断返回结果。

addWorker():增加线程任务到任务队列

1. 判断ctl是否已经大于等于maximumPoolSize。
2. 创建Worker,创建完成之后,执行线程。
3. Worker实现了Runnable接口,查看Worker的run方法:主要是判断是不是传入了任务,没有传入任务,则调用getTask()方法。
4. getTask():获取队列中的任务。
5. 执行任务。
6. ctl执行减1操作。

reject():拒绝服务。java线程池中的拒绝策略。

posted @ 2021-07-21 17:43  搬砖的孟达  阅读(7)  评论(0)    收藏  举报  来源