java手写线程池,完善中
package com.test001.threadpool; import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Vector;
import java.util.concurrent.Callable;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong; public class ThreadPool <T>{
private int maxRunThreadNum;
private int maxWaitTaskNum;
private int minActiveThreadNum;
private int addTaskTimeout;
private Vector<Worker> workerList;
private static ThreadPool threadPool;
private LinkedBlockingQueue<Task<T>> taskBlockingDeque;
private AtomicLong workingNum = new AtomicLong();
//初始化参数
private ThreadPool(){
maxRunThreadNum = 10;
maxWaitTaskNum = 50;
minActiveThreadNum = 5;
addTaskTimeout = 5;
workerList = new Vector<>(maxRunThreadNum);
taskBlockingDeque = new LinkedBlockingQueue<>(maxWaitTaskNum);
createWorker(minActiveThreadNum); } public synchronized static <T> ThreadPool<T> getThreadPool(){
if(threadPool==null){
threadPool = new ThreadPool<T>();
}
return threadPool;
} public synchronized void close(){
for (Worker worker:workerList){
worker.close();
worker.interrupt();
}
}
// 添加线程
private synchronized boolean createWorker(int num){
if(workerList.size()+num<maxRunThreadNum){
for (int i=0;i<num;i++) {
Worker worker = new Worker();
workerList.add(worker);
worker.start();
}
return true;
}
return false;
} public Future<T> addTask(Callable<T> callable) throws Exception {
// TODO::考虑 计算当前启动的worker和最大worker之间的数量 以及当前正在运行的和启动的数量,启动更多worker
System.out.println("add");
Task<T> task = new Task<>(callable);
boolean flag = taskBlockingDeque.offer(task,addTaskTimeout, TimeUnit.SECONDS);
if(!flag) return null;
return task.getFuture();
} class Task<T>{
public Callable<T> getCallable() {
return callable;
} public void setCallable(Callable<T> callable) {
this.callable = callable;
} public Future<T> getFuture() {
return future;
} public void setFuture(Future<T> future) {
this.future = future;
} private Callable<T> callable;
private Future<T> future; public Task(Callable<T> callable){
this.callable = callable;
this.future = new Future<>();
} } class Worker extends Thread{
private boolean closeFlag = false;
@Override
public void run() {
while(!closeFlag){
if(taskBlockingDeque.isEmpty()){
// TODO::新增信号量,等待唤醒
}else{
Task<T> task = taskBlockingDeque.poll();
if(task!=null){
Callable<T> callable = task.getCallable();
Future<T> future = task.getFuture();
try {
workingNum.getAndDecrement();
T t = callable.call();
// System.out.println("get t="+t);
future.set(t);
workingNum.decrementAndGet();
} catch (Exception e) {
e.printStackTrace();
}
} }
}
} public void close(){
closeFlag = true;
}
} public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis(); //获取开始时间 ThreadPool<Integer> t = ThreadPool.getThreadPool();
List<Future<Integer>> futures = new LinkedList<>();
for (int i=1;i<=50;i++){
Integer data = i;
Future<Integer> f = t.addTask(()->{
Random rd = new Random();
// int num = rd.nextInt(5)+1;
int num = data;
// System.out.println("start\tdata="+data+"\t thread="+Thread.currentThread().getName()+"\tsleep:"+num);
Thread.sleep(num*1000);
System.out.println("end\tdata="+data+"\tthread="+Thread.currentThread().getName());
return num;
});
futures.add(f);
}
// Thread.sleep(25*1000);
int i =0;
for(Future<Integer> f :futures){
i++;
System.out.println("get data\t"+i+"="+f.get());
}
t.close();
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
} } class Future<T>{
private volatile boolean hasResp = false;
private T t;
private Semaphore semaphore = new Semaphore(1);
public Future(){
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public T get() throws InterruptedException {
// 等待对应的信号量,然后到对应任务编号,取出对应的值
semaphore.acquire();
return t;
} protected void set(T t){
this.t = t;
semaphore.release();
} }
java手写线程池,完善中的更多相关文章
- 手写线程池,对照学习ThreadPoolExecutor线程池实现原理!
作者:小傅哥 博客:https://bugstack.cn Github:https://github.com/fuzhengwei/CodeGuide/wiki 沉淀.分享.成长,让自己和他人都能有 ...
- Java实现终止线程池中正在运行的定时任务
源于开发 最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能.说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴.然而quartz框架太重了,小项目根本不好操作啊.当然, ...
- Go组件学习——手写连接池并没有那么简单
1.背景 前段时间在看gorm,发现gorm是复用database/sql的连接池. 于是翻了下database/sql的数据库连接池的代码实现,看完代码,好像也不是很复杂,但是总觉得理解不够深刻,于 ...
- Java多线程和线程池
转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...
- Java实现的 线程池
由于最近开始学习java,用到了线程池,按照之前c++的写法写出此java版的线程池 TaskRunnale实现相关任务的接口,具体要实现什么任务在相应的run函数中实现. package threa ...
- java并发包&线程池原理分析&锁的深度化
java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的, ...
- 线程池是什么?Java四种线程池的使用介绍
使用线程池的好处有很多,比如节省系统资源的开销,节省创建和销毁线程的时间等,当我们需要处理的任务较多时,就可以使用线程池,可能还有很多用户不知道Java线程池如何使用?下面小编给大家分享Java四种线 ...
- Java 多线程:线程池
Java 多线程:线程池 作者:Grey 原文地址: 博客园:Java 多线程:线程池 CSDN:Java 多线程:线程池 工作原理 线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时: ...
- 自己动手写线程池——向JDK线程池进发
自己动手写线程池--向JDK线程池进发 前言 在前面的文章自己动手写乞丐版线程池中,我们写了一个非常简单的线程池实现,这个只是一个非常简单的实现,在本篇文章当中我们将要实现一个和JDK内部实现的线程池 ...
随机推荐
- vue的配置环境篇
1.电脑已经安装的nodejs和webpack. 2.1)打开cmd.win+r.可以直接输入node -v查看版本.安装淘宝镜像 npm install -g cnpm --registry=ht ...
- 【由浅入深理解java集合】(四)——集合 Queue
今天我们来介绍下集合Queue中的几个重要的实现类.关于集合Queue中的内容就比较少了.主要是针对队列这种数据结构的使用来介绍Queue中的实现类. Queue用于模拟队列这种数据结构,队列通常是指 ...
- from表单校验插件 validate 实例
$("#nextSubmit").click(function(){ $("#recovePasswordForm").submit(); }); $(&quo ...
- Ubuntu18.04安装Python虚拟环境
仅为使用Ubuntu18.04的Python开发人员作参考 1.安装Ubuntu18.04虚拟环境 sudo apt install virtualenv sudo apt install virtu ...
- vue+element ui 表格自定义样式溢出隐藏
样式 .hoveTitle { text-align: left; width: 140px; overflow: hidden; text-overflow: ellipsis; white-spa ...
- python全栈开发day111-flask路由及其参数,Flask配置,蓝图,几个装饰器、闪现、send_file、jsonify
1.endpoint参数,解决视图函数重名问题(包括装饰后重名问题) http://www.cnblogs.com/eric-nirnava/p/endpoint.html 每个应用程序app都有一个 ...
- 这里主要展示在Win7下怎么用IIS发布局域网站
首先对IIS做一个简要的介绍: IIS(InternetInformationServices)互联网信息服务的简称.本质是一种Web(网页)服务组件,其中包含Web.FTP和SMTP三大服务器,分别 ...
- thinkphp的静态缓存,数据缓存,快速缓存,查询缓存
// 静态缓存 // 'HTML_PATH' 缓存目录,这是个常量不是配置项,在入口文件中定义 // 'HTML_CACHE_ON' => true, // 开启静态缓存 'HTM ...
- python可视化pyecharts
python可视化pyecharts 简单介绍 pyecharts 是一个用于生成 Echarts 图表的类库.Echarts 是百度开源的一个数据可视化 JS 库.用 Echarts 生成的图可视化 ...
- ubantu中执行docker免sudo方法
1.添加用户组,如果已存在则不用设置. sudo groupadd docker 2.将用户加入该 group (docker)内 sudo gpasswd -a ${USER} docker 3.重 ...