纯手写线程池
发布日期:2021-06-30 12:37:03
浏览次数:2
分类:技术文章
本文共 2528 字,大约阅读时间需要 8 分钟。
线程池定义类
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 ListworkThreads; // 存放未执行任务的队列容器 private final BlockingQueue 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=0Thread-2 执行... i=4Thread-2 执行... i=6Thread-4 执行... i=3Thread-1 执行... i=2Thread-1 执行... i=9Thread-3 执行... i=1Thread-3 执行... i=11Thread-1 执行... i=10Thread-4 执行... i=8Thread-2 执行... i=7Thread-0 执行... i=5Thread-4 执行... i=14Thread-1 执行... i=13Thread-3 执行... i=12
demo工程下载地址:
转载地址:https://javalib.blog.csdn.net/article/details/106490734 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
不错!
[***.144.177.141]2024年05月05日 13时08分36秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
基于jwt的用户鉴权:配置拦截器并测试
2019-05-01
POI的概述
2019-05-01
POI文件导入:跨服务器调用查询部门信息
2019-05-01
DataURL:概述
2019-05-01
DataURL:实现原理及优缺点分析
2019-05-01
DataURL:实现员工头像保存
2019-05-01
DataURL:员工头像回显
2019-05-01
七牛云存储:通过SDK上传图片
2019-05-01
七牛云存储:断点续传
2019-05-01
七牛云存储:实现员工头像保存
2019-05-01
JasperReport:概述
2019-05-01
JasperReport:声明周期
2019-05-01
递归【应用】
2019-05-01
递归求阶乘
2019-05-01
递归遍历目录
2019-05-01
IO流概述和分类
2019-05-01
字节流写数据
2019-05-01
字节流写数据的三种方式
2019-05-01
字节流写数据的两个小问题
2019-05-01
字节流写数据加异常处理
2019-05-01