纯手写线程池

在这里插入图片描述

线程池定义类

package com.nobody;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * 自定义线程池
 * 本实现没考虑空闲线程处理,拒绝策略等,后续再将这部分补上。
 * 有兴趣者可以自行实现下。
 * 
 * @author Μr.ηobοdy
 *
 * @date 2020-06-02
 *
 */
public class MyExecutorService {

    // 保持一直运行的线程
    private List<WorkThread> workThreads;

    // 存放未执行任务的队列容器
    private final BlockingQueue<Runnable> workQueue;

    // 标志线程池关闭与否
    private boolean isWorking = true;

    // 构造函数,初始化线程池
    public MyExecutorService(int corePoolSize, int queueCapacity) {
        workThreads = new ArrayList<>(corePoolSize);
        workQueue = new LinkedBlockingQueue<>(queueCapacity);
        // 提前预热创建固定数量的线程,保持运行状态
        for (int i = 0; i < corePoolSize; i++) {
            WorkThread workThread = new WorkThread();
            workThread.start();
            workThreads.add(workThread);
        }
    }

    // 调用execute执行任务,实际上先放入任务队列中
    public boolean execute(Runnable task) {
        if (null != task) {
            return workQueue.offer(task);
        }
        return false;
    }

    // 优雅关闭线程池
    public void shutdown() {
        isWorking = false;
    }

    // 工作线程类
    class WorkThread extends Thread {
        @Override
        public void run() {
            // 如果线程池未关闭,并且任务队列还有未执行任务,则线程不断从任务队列取任务,如果能取到则执行任务的run方法
            while (isWorking || !workQueue.isEmpty()) {
                Runnable task = workQueue.poll();
                if (null != task) {
                    task.run();
                }
            }
        }
    }

}

测试类

package com.nobody;

/**
 * 测试线程池
 * 
 * @author Μr.ηobοdy
 *
 * @date 2020-06-02
 *
 */
public class Main {

    public static void main(String[] args) {

        // 1.创建线程池
        MyExecutorService myExecutorService = new MyExecutorService(5, 100);

        // 2.创建15个任务
        for (int i = 0; i < 15; i++) {
            final int finalI = i;
            myExecutorService.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName() + " 执行... i=" + finalI);
                }
            });
        }

        // 3.关闭线程池
        myExecutorService.shutdown();

    }

}

测试结果

Thread-0 执行... i=0
Thread-2 执行... i=4
Thread-2 执行... i=6
Thread-4 执行... i=3
Thread-1 执行... i=2
Thread-1 执行... i=9
Thread-3 执行... i=1
Thread-3 执行... i=11
Thread-1 执行... i=10
Thread-4 执行... i=8
Thread-2 执行... i=7
Thread-0 执行... i=5
Thread-4 执行... i=14
Thread-1 执行... i=13
Thread-3 执行... i=12

demo工程下载地址:https://github.com/LucioChn/MyExecutorService.git

猜你喜欢

转载自blog.csdn.net/chenlixiao007/article/details/106490734
今日推荐