自己动手,写一个简单的线程池(3)
来源:互联网 发布:软件问题报告模板 编辑:程序博客网 时间:2024/05/18 03:47
接上篇
为了更好的利用资源,线程池需要动态调整线程数量。
首先,定义好最小线程,活跃线程,最大线程数量
private static int min; private static int active; private static int max;
在线程池执行任务过程中,还需要有另一线程负责线程的新建和回收。因此简单让SimpleThreadPool继承Thread,覆写run方法
@Override public void run() { while (!isShutDown) { try { // System.out.printf("Min:%d,Active:%d,Max:%d,TaskSize:%d,CurrentTaskExecutors:%d\n", min, active, max , TASK_QUEUE.size(), TASK_EXECUTORS.size()); if (TASK_QUEUE.size() > active && size < active) { int toBeCreated = active - size; for (int i = 0; i < toBeCreated; i++) { TaskExecutor taskExecutor = createExecutor(); TASK_EXECUTORS.add(taskExecutor); } size = active; } else if (TASK_QUEUE.size() > max && size < max) { int toBeCreated = max - size; for (int i = 0; i < toBeCreated; i++) { TaskExecutor taskExecutor = createExecutor(); TASK_EXECUTORS.add(taskExecutor); } size = max; } synchronized (TASK_EXECUTORS) { if (TASK_QUEUE.isEmpty() && size > active) { int toBeRemoved = size - active; for (Iterator<TaskExecutor> it = TASK_EXECUTORS.iterator(); it.hasNext(); ) { TaskExecutor taskExecutor = it.next(); if (toBeRemoved <= 0) { break; } if (taskExecutor.getTaskState() == TaskState.RUNNING) { continue; } // System.out.println("--------reduce----------"); taskExecutor.shutdown(); taskExecutor.interrupt(); it.remove(); toBeRemoved--; } size = active; } } Thread.sleep(5_000); } catch (InterruptedException e) { e.printStackTrace(); } } }
测试
public class SimpleThreadPoolTest { public static void main(String[] args) throws Exception { SimpleThreadPool pool = new SimpleThreadPool(); for (int i = 0; i < 40; i++) { int finalI = i; pool.addTask(() -> { System.out.println(Thread.currentThread().getName() + " ==> is execute task " + finalI); try { Thread.sleep(5_000); } catch (InterruptedException e) { e.printStackTrace(); } }); } pool.shutdown(); //pool.addTask(() -> System.out.println("===")); }
结果
Min:4,Active:8,Max:12,TaskSize:0,CurrentTaskExecutors:4toBeCreated 1 4SIMPLE_THREAD_POOL-0 ==> is execute task 3SIMPLE_THREAD_POOL-2 ==> is execute task 1SIMPLE_THREAD_POOL-3 ==> is execute task 0SIMPLE_THREAD_POOL-4 ==> is execute task 4SIMPLE_THREAD_POOL-1 ==> is execute task 2SIMPLE_THREAD_POOL-5 ==> is execute task 5SIMPLE_THREAD_POOL-6 ==> is execute task 6SIMPLE_THREAD_POOL-7 ==> is execute task 7SIMPLE_THREAD_POOL-0 ==> is execute task 8SIMPLE_THREAD_POOL-1 ==> is execute task 12SIMPLE_THREAD_POOL-4 ==> is execute task 11SIMPLE_THREAD_POOL-2 ==> is execute task 9SIMPLE_THREAD_POOL-3 ==> is execute task 10Min:4,Active:8,Max:12,TaskSize:26,CurrentTaskExecutors:8SIMPLE_THREAD_POOL-6 ==> is execute task 13SIMPLE_THREAD_POOL-5 ==> is execute task 14SIMPLE_THREAD_POOL-7 ==> is execute task 15SIMPLE_THREAD_POOL-8 ==> is execute task 16SIMPLE_THREAD_POOL-9 ==> is execute task 17SIMPLE_THREAD_POOL-10 ==> is execute task 18SIMPLE_THREAD_POOL-11 ==> is execute task 19SIMPLE_THREAD_POOL-0 ==> is execute task 20SIMPLE_THREAD_POOL-2 ==> is execute task 23SIMPLE_THREAD_POOL-1 ==> is execute task 21SIMPLE_THREAD_POOL-4 ==> is execute task 22SIMPLE_THREAD_POOL-3 ==> is execute task 24SIMPLE_THREAD_POOL-6 ==> is execute task 25SIMPLE_THREAD_POOL-10 ==> is execute task 30SIMPLE_THREAD_POOL-7 ==> is execute task 27SIMPLE_THREAD_POOL-5 ==> is execute task 26SIMPLE_THREAD_POOL-9 ==> is execute task 28Min:4,Active:8,Max:12,TaskSize:11,CurrentTaskExecutors:12SIMPLE_THREAD_POOL-8 ==> is execute task 29SIMPLE_THREAD_POOL-11 ==> is execute task 31SIMPLE_THREAD_POOL-2 ==> is execute task 33SIMPLE_THREAD_POOL-4 ==> is execute task 35SIMPLE_THREAD_POOL-1 ==> is execute task 34SIMPLE_THREAD_POOL-3 ==> is execute task 36SIMPLE_THREAD_POOL-0 ==> is execute task 32Min:4,Active:8,Max:12,TaskSize:3,CurrentTaskExecutors:12SIMPLE_THREAD_POOL-7 ==> is execute task 38SIMPLE_THREAD_POOL-9 ==> is execute task 39SIMPLE_THREAD_POOL-5 ==> is execute task 37--------reduce------------------reduce------------------reduce------------------reduce----------Min:4,Active:8,Max:12,TaskSize:0,CurrentTaskExecutors:8all threads are dead.Process finished with exit code 0
可以看出,当任务数量增加或者减少时,线程池的线程数量也会动态调整
阅读全文
0 0
- 自己动手,写一个简单的线程池(3)
- 自己动手,写一个简单的线程池(1)
- 自己动手,写一个简单的线程池(2)
- 自己动手写一个简单的MVC框架(第一版)
- 自己动手写一个简单的MVC框架(第二版)
- 自己动手写一个简单的MVC框架(第二版)
- 自己动手写一个简单的bootloader
- 写一个简单的线程池
- 自己动手实现简单的线程池
- 自己动手写一个简单的Shell之一:了解Shell
- 自己动手写一个简单的Shell之二:运行程序
- 自己动手写一个简单的Shell之三:命令行解析
- 自己动手写一个简单的Shell之四:流程控制
- 自己动手写一个简单的Windows shell扩展程序
- 自己动手写一个简单的php模板引擎
- 自己动手写一个简单图片轮播的控件
- 自己动手写简单的eventbus
- ROS(二)自己动手写一个简单的发布(Publisher)、订阅(Subscriber)程序
- 2018届校招面试集
- 图像随机产生
- 树莓派3b使用一路继电器控制小风扇
- 我说设计模式
- 【NOIP2017提高A组集训10.28】序列操作
- 自己动手,写一个简单的线程池(3)
- 递归和非递归的方式实现二叉树的先序、中序和后序遍历
- 85. Maximal Rectangle
- Nginx服务器安装及配置文件详解
- Unity3D 热更新方案(集合各位专家的汇总)
- easydss与linux内核接收网络数据流程(二)
- 171029—函数自学【函数地址和函数指针】
- 15.4.3 转换流
- Codeforces 24D 期望DP 解题报告