java多线程之自定义线程池
1.背景
线程池.....大家常用....
自己搞一个,顺便练习一下多线程编程
2.自定义线程代码
2.1.拒绝策略接口
@FunctionalInterface
public interface MyRejectPolicy<T> {
void reject(MyBlockingQueue<T> queue, T task);
}
2.2.自定义阻塞队列
@Slf4j
public class MyBlockingQueue<T> {
// 1.任务队列
private Deque<T> queue = new ArrayDeque<>();
// 2.容量
private int capacity;
// 3.锁
private ReentrantLock lock = new ReentrantLock();
// 4.生产者条件变量
private Condition producerCondition = lock.newCondition();
// 5.消费者条件变量
private Condition consumerCondition = lock.newCondition(); // 构造方法
public MyBlockingQueue(int capacity) {
this.capacity = capacity;
} // 阻塞获取
public T take() {
lock.lock();
try {
// 判断是否为空
while (queue.isEmpty()) {
try {
// 无任务消费者等待
log.info("无任务,消费者等待....");
consumerCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 不为空,消费者获取一个任务
T t = queue.removeFirst();
log.info("消费者已获取到任务t={}", t);
// 通知生产者放入任务
producerCondition.signal();
return t;
} finally {
lock.unlock();
}
} // 阻塞添加
public void put(T t) {
lock.lock();
try {
while (queue.size() >= capacity) {
try {
// 队列已满,生产者等待
log.info("......队列已满,生产者等待");
producerCondition.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 放入队列
queue.addLast(t);
log.info("......生产者,以将任务放入队列");
// 通知消费者获取任务
consumerCondition.signal();
} finally {
lock.unlock();
}
}
}
2.3.自定义工作线程
@Slf4j
public class MyWorkerThread extends Thread {
// 线程集合
private HashSet<MyWorkerThread> workerThreadList = new HashSet<>();
// 任务队列
private MyBlockingQueue<Runnable> taskQueue;
// 任务对象
private Runnable task; /**
* 构造方法
*
* @param task
*/
public MyWorkerThread(HashSet<MyWorkerThread> workerThreadList, MyBlockingQueue<Runnable> taskQueue, Runnable task) {
this.workerThreadList = workerThreadList;
this.taskQueue = taskQueue;
this.task = task;
} /**
* 执行任务
*/
@Override
public void run() {
// 当【task不为空】时执行当前任务
// 当【task为空】时,从队列中获取任务再执行
while (task != null || ((task = taskQueue.take()) != null)) {
try {
// 执行任务
log.info("执行当前任务:{}", task);
task.run();
} finally {
// 将任务设置为空
task = null;
}
}
// 无任务,释放线程
synchronized (workerThreadList) {
log.info("无任务,删除当前线程:{}", this);
workerThreadList.remove(this);
}
}
}
2.4.自定义线程池
@Slf4j
public class MyThreadPool {
// 核心线程数
private int coreSize;
// 阻塞队列
private MyBlockingQueue<Runnable> taskQueue;
// 线程集合
private HashSet<MyWorkerThread> workerThreadList = new HashSet<>();
// 拒绝策略
private MyRejectPolicy<Runnable> rejectPolicy; /**
* 线程池构造器
*
* @param coreSize
* @param rejectPolicy
*/
public MyThreadPool(int coreSize, MyRejectPolicy<Runnable> rejectPolicy) {
this.coreSize = coreSize;
this.taskQueue = new MyBlockingQueue<>(coreSize);
this.rejectPolicy = rejectPolicy;
} /**
*
*/
public void execute(Runnable task) {
// 当任务数【没有超过】核心线程数coreSize时,直接给workerThreadList 执行
// 当任务数【超过】核心线程数coreSize时,放入队列
synchronized (workerThreadList) {
int size = workerThreadList.size();
if (size < coreSize) {
MyWorkerThread workerThread = new MyWorkerThread(workerThreadList, taskQueue, task);
workerThread.setName("工作线程-" + (size + 1));
log.info("创建线程对象:{},执行任务:{}", workerThread, task);
workerThreadList.add(workerThread);
workerThread.start();
} else {
taskQueue.put(task);
}
}
}
}
3.测试
@Slf4j
public class Test01 {
/**
* 测试自定义的线程池
* @param args
*/
public static void main(String[] args) {
// 创建线程池
MyThreadPool pool = new MyThreadPool(2, (queue, task) -> {
queue.put(task);
});
// 执行任务
pool.execute(()->{
log.info("执行任务1...");
});
pool.execute(()->{
log.info("执行任务2...");
});
pool.execute(()->{
log.info("执行任务3...");
});
}
}
完美!
java多线程之自定义线程池的更多相关文章
- Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
- Java多线程系列--“JUC线程池”02之 线程池原理(一)
概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...
- Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
- Java多线程系列--“JUC线程池”04之 线程池原理(三)
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...
- Java多线程系列--“JUC线程池”05之 线程池原理(四)
概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...
- 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例
java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...
- Java多线程-新特性-线程池
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...
- java多线程9:线程池
线程池 线程池的优点 我们知道线程的创建和上下文的切换也是需要消耗CPU资源的,所以在多线程任务下,使用线程池的优点就有: 第一:降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. ...
- java多线程之 Executors线程池管理
1. 类 Executors 此类中提供的一些方法有: 1.1 public static ExecutorService newCachedThreadPool() 创建一个可根据需要创建新线程的线 ...
- Java多线程之细说线程池
前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...
随机推荐
- 高性能版本的零内存分配LikeString函数(ZeroMemAllocLikeOperator)
继上一篇文章在.NET Core,除了VB的LikeString,还有其它方法吗?(四种LikeString实现分享)分享了四种实现方式,笔者对这四种实现方式,不管是执行性能还是内存分配性能上,都不太 ...
- 一款.NET开源、功能强大、跨平台的绘图库 - OxyPlot
前言 今天大姚给大家分享一款.NET开源(MIT License).免费.跨平台.功能强大的绘图库,支持多平台使用(包括:WPF.UWP.WinForm.Silverlight.Xamarin.iOS ...
- Docker入门系列之四:Docker镜像
在本文中,您将学习如何加快Docker构建周期并创建轻量级镜像.遵循之前的文章中的食物隐喻,我们将沙拉隐喻为Docker镜像,同时减少Docker镜像的数量. 在本系列的第3部分中,我们介绍了十几个D ...
- 「C++」简单模拟
这是一个公式: \[F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{ ...
- rabbitMq实现系统内的短信发送设计&动态获取BEAN
rabbitMq实现系统内的短信发送设计&动态获取BEAN 1.短信非系统的重要节点操作,可以在任务完成之后,比如下单成功,发送下单成功的mq消息,短信服务接收到mq消息,动态的判断该短信的c ...
- python 第一次主要是if while 奇偶数的练习
例如输出1-10的数字,但是7除外. a=1 while a < 11: if a == 7: pass else: print(a) a=a+1 输出1-100所以的偶数 a=1 while ...
- 使用 GPU 进行 Lightmap 烘焙 - 简单 demo
作者:i_dovelemon 日期:2024-06-16 主题:Lightmap, PathTracer, Compute Shader 引言 一直以来,我都对离线 bake lightmap 操作很 ...
- 图最短路径之Dijkstra
Dijkstra's shortest path algorithm 算法参考地址:Dijsktra's algorithm (geeksforgeeks.org) 算法的简介: 1)该算法用来计算最 ...
- 高通Android UEFI XBL 代码流程分析
高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...
- 多核处理器与MP架构
多核处理器也称片上多核处理器(Chip Multi-Processor,CMP). 多核处理器的流行 多核出现前,商业化处理器都致力于单核处理器的发展,其性能已经发挥到极致,仅仅提高单核芯片的速度会产 ...