Java实现手写线程池实例并测试详解
作者:小威要向诸佬学习呀 发布时间:2022-03-04 11:23:27
标签:Java,线程池
前言
在之前的文章中介绍过线程池的核心原理,在一次面试中面试官让手写线程池,这块知识忘记的差不多了,因此本篇文章做一个回顾。
希望能够加深自己的印象以及帮助到其他的小伙伴儿们
在线程池核心原理篇介绍过线程池的核心原理,今天来模拟线程池和工作队列的流程,以及编写代码和测试类进行测试。下面附下之前线程池的核心流程:
在线程池核心原理的源码中,涉及到了一系列的流程,包括线程池队列数量是否已满,运用什么样的拒绝策略等。在我们手写线程池的代码中,不需要考虑那么多因素,只需要模拟简单的情景和过程,因此整体来讲还是比较简单的。
手写线程池,必不可少的组件有任务队列,任务的消费者线程池,线程池创建等。我们也可定义构造方法,创建指定大小的线程池线程个数。当然在使用完线程池中的线程后,我们需要考虑将其销毁或关闭。
相关代码和解释如下:
package XIAOWEI;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.stream.IntStream;
public class ThreadPool {
private static final int WorkQueueSIZE = 5;
private BlockingQueue<Runnable> workQueue;
private List<WorkThread> workThreads=new ArrayList<WorkThread>();
/**
* @author xiaowei
* @param poolSize
* @param workQueue
* 构造方法,传线程池的大小和阻塞队列
*/
public ThreadPool(int poolSize,BlockingQueue<Runnable> workQueue) {
this.workQueue = workQueue;
IntStream.range(0,poolSize).forEach((i)->{
WorkThread workThread=new WorkThread();
workThread.start();
workThreads.add(workThread);
});
}
/**
* @param poolSize
* 在ThreadPool的构造方法中传入线程池的大小
*/
public ThreadPool(int poolSize){
this(poolSize,new LinkedBlockingQueue<>(WorkQueueSIZE));
}
/**
* @param task
* 通过线程池执行任务
*/
public void extcute(Runnable task){
try {
workQueue.put(task);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void shutdown(){
if(workThreads!=null && workThreads.size()>0){
workThreads.stream().forEach((workThread) -> {
workThread.interrupt();
});
}
}
/**
* 内部类 源源不断的消耗workQueue中的任务
*/
class WorkThread extends Thread {
@Override
public void run() {
Thread currentThread = Thread.currentThread();
// 死循环 不断一直消费队列中的任务 直到任务被消费完全
while (true) {
try {
if (currentThread.isInterrupted()) {
break;
}
Runnable workTasK = workQueue.take();
workTasK.run();
} catch (InterruptedException e) {
currentThread.interrupt();
}
}
}
}
}
相关测试代码如下:
package XIAOWEI;
import java.util.stream.IntStream;
public class ThreadPoolTest {
public static void main(String[] args) {
ThreadPool threadPool = new ThreadPool(5);
IntStream.range(0,10).forEach((i)->{
threadPool.extcute(()->{
System.out.println(Thread.currentThread().getName()+"2023一起加油");
});
});
threadPool.shutdown();
}
}
一共在线程池中加入了五个线程和十个任务,因此每个线程会执行两个任务。
测试结果如下图所示:
来源:https://blog.csdn.net/qq_53847859/article/details/129113884


猜你喜欢
- CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout
- 目录问题描述解决办法本文介绍下PasswordBox进行数据绑定的方法,本文参考链接。本文完整示例程序见GitHub。问题描述Passwor
- 对于以下数据,如何在运行时通过字符串来得到静态变量UIPath的值。public class GameMainMenu : UIClass{
- Alt+Enter快捷键是Idea中比较特殊的一个快捷键。它有很多功能,比如:导入包,自动修正代码 解决出现的问题 也可以生成返回值。这里有
- 在项目中经常会遇到对按钮、自定义控件的 Item 等防止多次重复的点击的问题,下面做一个小结。方法1:使用 RxJava 的 throttl
- 前言:微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同时,微信公众号提供了相应
- 一、前言对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。二、MyBatis的初始化做了什么2.1 Mybatis的
- 每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联。Handler一般有两种用途:1)执行计划任务,
- 首先我们设计了模块层次图,当然图中只是给出一种实现方式,不局限于此。具体见下图。主要功能介绍如下:1)请求接口层。处理HTTP请求,及响应2
- 目录1. List1.1 List 的常见方法1.2 代码示例2. ArrayList2.1 介绍2.2 ArrayList 的构造方法2.
- session超时退到登录页面最近发现使用的工程居然没有session超时机制,功能太欠缺了,现在把追加方法分享出来,里面有一些坑,大家自由
- 在开发过程中,与用户交互式免不了会用到对话框以实现更好的用户体验,所以掌握几种对话框的实现方法还是非常有必要的。在看具体实例之前先对Aler
- 关于springmvc上传图片的方法小编给大家整理了两种方法,具体内容如下所示:第一种:(放在该项目下的物理地址对应的位置)a. 路径写法:
- 实践过程效果代码public partial class Frm_Libretto : Form{ public
- 目录概述LRU 的原理LRU 算法的实现LRU 算法描述LRU 算法代码实现方法一方法二方法三总结概述LRU 算法全称为 Least Rec
- 本文实例为大家分享了java实现人机猜拳游戏的具体代码,供大家参考,具体内容如下完成人机猜拳互动游戏的开发,用户通过控制台输入实现出拳,电脑
- 今天要分享一个非常简单的功能:使用Android原生控件Gallery实现照片拖动的特效实现思路如下:在布局文件中定义一个Gallery控件
- 引言native image是GraalVM中提供的一个命令,可以把字节码文件或Jar包编译成为一个二进制可执行文件,同时它自己也是用Jav
- Java ByteArrayInputStream流一、ByteArrayInputStream流定义API说明:ByteArrayInpu
- 写应用程序的过程中,弹窗是个避免不了的功能,显示中,假设弹窗背景色和主窗口背景色相差不多,甚至是一样的时候,就会存在一个比较严重的人机交互和