一、线程池
测试类TestTask运行时会启动多个缓存线程池,缓存线程池的数量根据服务器配置动态获取;
二、优缺点
优点:可异步,异步任务量较大,对于中型项目、产品,这样的异步处理机制是完全满足要求的; 缺点:由于任务执行者需要一直监测任务队列是否还有要执行的任务,所以会导致即使缓存线程池超时,也不会自动销毁,消耗资源;
三、结果
运行TestRunable.java:
当前缓存线程池,java.util.concurrent.ThreadPoolExecutor@4e25154f[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0] 缓存线程池测试 2021-04-25 17:37:40 2021-04-25 17:37:41 2021-04-25 17:37:42 2021-04-25 17:37:43 2021-04-25 17:37:44 缓存线程池已自动关闭,java.util.concurrent.ThreadPoolExecutor@4e25154f[Running, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 1] 缓存线程池中的线程是否已全部执行完,false 缓存线程池是否已关闭,false
运行TestTask.java:
欢迎测试任务队列。。 请输入你本次要执行的异步任务个数: 1 第1个工人已在线 第2个工人已在线 任务队列已激活 第3个工人已在线 任务队列已激活 第4个工人已在线 任务队列已激活 任务队列已激活 当前任务计数小于最大任务量,正在唤醒,curr=0,MAX_TASK=1 异步任务队列测试,0 当前线程号:pool-1-thread-2,第1次执行异步任务,finishedTasks={pool-1-thread-2=1} 请输入你本次要执行的异步任务个数: 2 异步任务队列测试,0 当前任务计数小于最大任务量,正在唤醒,curr=0,MAX_TASK=1 异步任务队列测试,1 当前线程号:pool-1-thread-1,第1次执行异步任务,finishedTasks={pool-1-thread-1=1, pool-1-thread-2=1, pool-1-thread-4=1} 当前线程号:pool-1-thread-4,第1次执行异步任务,finishedTasks={pool-1-thread-2=1, pool-1-thread-4=1} 请输入你本次要执行的异步任务个数: 3 异步任务队列测试,0 异步任务队列测试,1 当前线程号:pool-1-thread-1,第2次执行异步任务,finishedTasks={pool-1-thread-1=2, pool-1-thread-2=1, pool-1-thread-4=1} 当前任务计数小于最大任务量,正在唤醒,curr=0,MAX_TASK=1 当前线程号:pool-1-thread-3,第1次执行异步任务,finishedTasks={pool-1-thread-1=2, pool-1-thread-3=1, pool-1-thread-2=1, pool-1-thread-4=1} 异步任务队列测试,2 当前线程号:pool-1-thread-4,第2次执行异步任务,finishedTasks={pool-1-thread-1=2, pool-1-thread-3=1, pool-1-thread-2=1, pool-1-thread-4=2} 请输入你本次要执行的异步任务个数: 0 结束!
四、项目源码见:
https://www.edspace.com.cn/pc/toLookLinkShareUI?shareUrl=21aaca33-e237-6e0a-3390-874c92405e80
*该机制模拟的线程安全中的生产者和消费者案例,关于线程安全的入门了解,可参考【java并发编程应用实例】
*有更多处理任务队列的方法,欢迎留言