SimpleThreadPool极简版
package com.dwz.concurrency.chapter13; import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List; /**
* 1.任务队列--调度 2.拒绝策略(抛出异常、直接丢弃、阻塞、临时队列)--性能保护 3.init(min) 4.active 5.max
* min<=active<=max Quartz/Control-M
*/
public class SimpleThreadPool {
private final int size;
private final static int DEFAULT_SIZE = 10;
private static volatile int seq = 0;
private final static String THREAD_PREFIX = "SIMPLE_THREAD_POOL-";
private final static ThreadGroup GROUP = new ThreadGroup("Pool_Group");
private final static LinkedList<Runnable> TASK_QUEUE = new LinkedList<>();
private final static List<WorkerTask> THREAD_QUEUE = new ArrayList<>(); public SimpleThreadPool() {
this(DEFAULT_SIZE);
} public SimpleThreadPool(int size) {
this.size = size;
init();
} private void init() {
for (int i = 0; i < this.size; i++) {
createWorkTask();
}
} public void submit(Runnable runnable) {
synchronized (TASK_QUEUE) {
TASK_QUEUE.addLast(runnable);
TASK_QUEUE.notifyAll();
}
} private void createWorkTask() {
WorkerTask task = new WorkerTask(GROUP, THREAD_PREFIX + (seq++));
task.start();
THREAD_QUEUE.add(task);
} private enum TaskState {
FREE, RUNNING, BLOCKED, DEAD
} private static class WorkerTask extends Thread {
private volatile TaskState taskState = TaskState.FREE; public WorkerTask(ThreadGroup group, String name) {
super(group, name);
} public TaskState getTaskState() {
return this.taskState;
} @Override
public void run() {
OUTER:
while (this.taskState != TaskState.DEAD) {
Runnable runnable = null;
synchronized (TASK_QUEUE) {
while (TASK_QUEUE.isEmpty()) {
try {
this.taskState = TaskState.BLOCKED;
TASK_QUEUE.wait();
} catch (InterruptedException e) {
e.printStackTrace();
// 线程被打断回到OUTER位置
break OUTER;
}
}
runnable = TASK_QUEUE.removeFirst();
} if (runnable != null) {
System.out.println("runnable into...");
this.taskState = TaskState.RUNNING;
runnable.run();
this.taskState = TaskState.FREE;
}
}
} public void close() {
this.taskState = TaskState.DEAD;
}
} public static void main(String[] args) {
SimpleThreadPool threadPool = new SimpleThreadPool();
// IntStream.range(0, 40).forEach(i -> {
// threadPool.submit(() -> {
// System.out.println("The runnable " + i + " be serviced by " + Thread.currentThread() + " start.");
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println("The runnable " + i + " be serviced by " + Thread.currentThread() + " finished.");
// });
// });
for(int i = 0; i < 40; i++) {
threadPool.submit(() -> {
System.out.println("The runnable be serviced by " + Thread.currentThread() + " start.");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("The runnable be serviced by " + Thread.currentThread() + " finished.");
});
}
}
}
该线程池只创建了默认的线程数量,不包含拒绝策略,线程池的打断、销毁和自动扩展线程数量,只保持了线程的最低性能,只是极简版,之后的文章会慢慢扩展
可参考文章:
https://blog.csdn.net/const_/article/details/89317907
SimpleThreadPool极简版的更多相关文章
- Underscore源码阅读极简版入门
看了网上的一些资料,发现大家都写得太复杂,让新手难以入门.于是写了这个极简版的Underscore源码阅读. 源码: https://github.com/hanzichi/underscore-an ...
- js消除小游戏(极简版)
js小游戏极简版 (1) 基础布局 <div class = "box"> <p></p> <div class="div&qu ...
- 极简版ASP.NET Core学习路径及教程
绝承认这是一个七天速成教程,即使有这个效果,我也不愿意接受这个名字.嗯. 这个路径分为两块: 实践入门 理论延伸 有了ASP.NET以及C#的知识以及项目经验,我们几乎可以不再需要了解任何新的知识就开 ...
- 【极简版】SpringBoot+SpringData JPA 管理系统
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 在上一篇中已经讲解了如何从零搭建一个SpringBo ...
- 【极简版】OpenGL 超级宝典(第五版)环境配置 VS2010
事先声明:该教程仅适用于VS2010环境下超级宝典第五版的配置 第一步:下载示例代码和环境包: 链接:https://pan.baidu.com/s/1llRRQ8ymBgMGuXp5M50pJw 提 ...
- Vue数据双向绑定(面试必备) 极简版
我又来吹牛逼了,这次我们简单说一下vue的数据双向绑定,我们这次不背题,而是要你理解这个流程,保证读完就懂,逢人能讲,面试必过,如果没做到,请再来看一遍,走起: 介绍双向数据之前,我们先解释几个名词: ...
- 极简版 react+webpack 脚手架
目录结构 asset/ css/ img/ src/ entry.js ------------------------ 入口文件 .babelrc index.html package.json w ...
- cookie——登录注册极简版
本实例旨在最直观地说明如何利用cookie完成登录注册功能,忽略正则验证. index.html <!doctype html> <html lang="en"& ...
- 极简版 卸载 home 扩充 根分区--centos7 xfs 文件格式
1. 查看文件系统 df -Th 2. 关闭正常连接 /home的用户 fuser /home 3. 卸载 /home的挂载点 umount /home 4.删除home的lv 注意 lv的名称的写法 ...
随机推荐
- idea查看接口或类的所有方法
第一种: 显示结果: 第二种: 点击左显示栏的Structure: 第三种:ctrl+f12,有的电脑可能需要加fn键
- sklearn.feature_extraction.text.CountVectorizer 学习
CountVectorizer: CountVectorizer可以将文本文档集合转换为token计数矩阵.(token可以理解成词) 此实现通过使用scipy.sparse.csr_matrix产生 ...
- nginx rewrite 规则
rewrite功能:使用nginx提供的全局变量或自设定的变量,结合正则表达式和标志位实现url重写以及重定向. 配置域:server,localtion. flag标志位 last : 相当 ...
- CNN-3: VGGNet 卷积神经网络模型
1.VGGNet 模型简介 VGG Net由牛津大学的视觉几何组(Visual Geometry Group)和 Google DeepMind公司的研究员一起研发的的深度卷积神经网络,在 ILSVR ...
- 脉脉的一道网红Java面试题
题目如下: public class Test { public static void main(String[] args) { int a = 10; int b = 10; // 需要在met ...
- Centos7.x 安装libevent2.x
1.在http://libevent.org/下载libevent-2.1.8-stable.tar.gz 2.tar -zxvf libevent-2.1.8-stable.tar.gz 3.cd ...
- C++函数的应用
函数的相关语法 函数的一般定义形式如下: 返回类型 函数名([参数表]) //函数头 { //函数体 ...
- LayUI笔记
LayUI 经典模块化前端框架,低门槛开箱即用的前端 UI 解决方案. 其他UI框架: Bootstrap,Element, EasyUI,LayUI 等等 LayUI使用 Layui ...
- SAS学习笔记7 合并语句(set、merge函数)
set函数:纵向合并数据集 set语句进行纵向合并.set语句的作用是将若干个数据集依次纵向连接,并存放到data语句建立的数据集中.若set后面只有一个数据集,此时相当于复制的作用 注:data语句 ...
- 设计Qt风格的C++API
在奇趣(Trolltech),为了改进Qt的开发体验,我们做了大量的研究.这篇文章里,我打算分享一些我们的发现,以及一些我们在设计Qt4时用到的原则,并且展示如何把这些原则应用到你的代码里. 优秀AP ...