【Java】实现一个自己的线程池

news2024/11/25 4:27:16

上文中我们讲了线程池的简单使用,这里我们来讲一下如何简单实现一个自己的线程池

本文实现这个线程池所达到的效果是:用户给出线程数目,程序根据用户给出的数创建固定数目的线程

1、框架

首先写定义一个线程池类

class MyThreadPool{
    
}

public class demo3 {
    public static void main(String[] args) throws InterruptedException {
        
    }
}

然后往MyThreadPool类中填充内容

 2、成员变量

首先定义成员变量

由于线程池中需要一个阻塞队列来存放任务,于是我们便先实现一个LinkedBlockingDeque阻塞队列。成员属性设置为私有

private BlockingDeque<Runnable> queue = new LinkedBlockingDeque<Runnable>();

什么是阻塞队列?

 3、submit()方法

线程池类型中还需要书写一个submit()方法用以添加任务

public void submit(Runnable runnable) throws InterruptedException {
    queue.put(runnable);
}

 4、构造方法

在MyThreadPool构造方法中,我们需要创建用户给定数目的线程,并用这些线程去执行队列中的任务

public MyThreadPool(int n){
        for (int i = 0; i < n; i++) {
            int id = i;
            Thread thread = new Thread(()->{
                Runnable runnable = null;
                try {
                    runnable = queue.take();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                runnable.run();
            });
            thread.start();
        }
}

5、完整代码

import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

class MyThreadPool{
    private BlockingDeque<Runnable> queue = new LinkedBlockingDeque<Runnable>();

    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }

    public MyThreadPool(int n){
        for (int i = 0; i < n; i++) {
            int id = i;
            Thread thread = new Thread(()->{
                Runnable runnable = null;
                try {
                    runnable = queue.take();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                runnable.run();
            });
            thread.start();
        }
    }
}

public class demo3 {
    public static void main(String[] args) throws InterruptedException {
        MyThreadPool threadPool = new MyThreadPool(10);
        for (int i = 0; i < 10; i++) {
            int id = i;
            threadPool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("任务" + id);
                }
            });
        }
    }
}

运行结果

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1260518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DBeaver连接MySQL提示“Public Key Retrieval is not allowed“问题解决方式

更新时间&#xff1a;2023年10月31日 11:37:53 作者&#xff1a;产品人小柒 dbeaver数据库连接工具,可以支持几乎所有的主流数据库.mysql,oracle.sqlserver,db2 等等,这篇文章主要给大家介绍了关于DBeaver连接MySQL提示"Public Key Retrieval is not allowed"问…

JVM——垃圾回收器(G1,JDK9默认为G1垃圾回收器)

1.G1垃圾回收器 JDK9之后默认的垃圾回收器是G1&#xff08;Garbage First&#xff09;垃圾回收器。 Parallel Scavenge关注吞吐量&#xff0c;允许用户设置最大暂停时间 &#xff0c;但是会减少年轻代可用空间的大小。 CMS关注暂停时间&#xff0c;但是吞吐量方面会下降。 而G1…

百度网盘PC端程序二维码刷新不出来

问题 百度网盘PC端程序二维码刷新不出来。 原因 下载的百度网盘PC端程序版本有问题。 解决办法 删除百度网盘PC端程序&#xff0c;从官网下载&#xff0c;选择“从microsoft获取”&#xff0c;安装后解决。

vue3通过provide和inject实现多层级组件通信

父组件 <template><div><h1>我是父组件 {{num}}</h1><hr><child></child></div> </template><script setup> import child from ./child.vue; import { ref,provide } from vue; let num ref(520) provide(pare…

论文阅读:“Model-based teeth reconstruction”

文章目录 AbstractIntroductionTeeth Prior ModelData PreparationParametric Teeth Model Teeth FittingTeeth Boundary Extraction Reference Abstract 近年来&#xff0c;基于图像的人脸重建方法日趋成熟。这些方法可以捕捉整个面部或面部特定区域&#xff08;如头发、眼睛…

业务逻辑漏洞原理及复现

业务逻辑漏洞复现 文章目录 业务逻辑漏洞复现什么是业务逻辑漏洞验证码绕过漏洞复现抓包1分钱购买商品dami_5.4逻辑漏洞复现皮卡丘验证码绕过 什么是业务逻辑漏洞 由于开发者的逻辑不严谨&#xff0c;造成的程序异常 由于开发者的逻辑不严谨造成的程序功能异常比如某一个购物…

许战海战略文库|主品牌升级为产业技术品牌,引领企业全球化发展

在当今高速发展的全球经济中&#xff0c;企业品牌已经成为其核心资产之一。这不仅仅是因为品牌可以为消费者带来识别度&#xff0c;更重要的是&#xff0c;它们可以为企业带来深厚的竞争壁垒。但对于许多企业来说&#xff0c;特别是技术密集型企业&#xff0c;仅仅依靠主品牌的…

【自然语言处理】利用sklearn库函数绘制三维瑞士卷

一&#xff0c;原理介绍 sklearn.datasets.make_swiss_roll&#xff08;&#xff09;函数提供了三维瑞士卷的数据集&#xff0c;我们可以利用他来生成瑞士卷&#xff0c;该函数的用法见sklearn官方文档&#xff1a;官网文档&#xff1a;sklearn.datasets.make_swiss_roll&…

【C++】bazel构建工具配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍bazel构建工具配置与使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷…

系列二十、Spring循环依赖问题

一、概述 循环依赖是指多个bean之间相互依赖&#xff0c;形成了一个闭环。比如A依赖于B、B依赖于C、C依赖于A&#xff0c;形成了一个圈&#xff0c;如&#xff1a; 二、循环依赖案例 2.1、构造方法注入产生循环依赖案例 2.1.1、ServiceA /*** Author : 一叶浮萍归大海* Date…

力扣:183. 从不订购的客户(Python3)

题目&#xff1a; Customers 表&#xff1a; ---------------------- | Column Name | Type | ---------------------- | id | int | | name | varchar | ---------------------- 在 SQL 中&#xff0c;id 是该表的主键。 该表的每一行都表示客户的 ID …

QMap key()和value(const Key key, const T defaultValue = T()) const第二个参数作用

value()函数介绍 返回与键key关联的值。 如果map不包含键为key的项&#xff0c;则该函数返回defaultValue。 如果没有指定defaultValue&#xff0c;该函数返回一个默认构造的值。 如果映射中有多个key项&#xff0c;则返回最近插入的项的值。 示例 定义自定义类型&#xff…

MATLAB中fft与fftshift的区别

两者的区别在于&#xff1a; fft函数将时域信号转换为频域信号&#xff0c;即将信号从时间域转换为频率域。fftshift函数用于对fft计算结果进行移位操作&#xff0c;将频域信号的零频率分量移到频谱的中心&#xff0c;方便观察和处理。fftshift函数将fft计 算结果沿着中心点进…

2023年最后一次PMP项目管理认证考试成功举行!

2023年11月25日&#xff0c;PMI项目管理资格认证考试顺利举行&#xff01; 才聚集团作为目前国内规模最大的项目管理专业考试服务机构&#xff0c;此次考试负责深圳、广州、东莞、珠海、南宁、保定6个城市的现场考务工作&#xff0c;各考点的布置&#xff0c;入场&#xff0c;…

门店预约系统会员小程序作用如何

除了线上卖货外&#xff0c;很多行业或商家的产品/服务需要进店&#xff0c;因此一款完善的门店预约系统是众商家需要的。 通过【雨科】平台搭建门店预约小程序&#xff0c;通过预约功能&#xff0c;客户可以查看服务并选择规格、时间等填写信息预约&#xff0c;客户与商家同时…

CMake语法解读 | Qt6需要用到

CMake 入门CMakeLists.txtmain.cpp编译示例cmake常用参数入门 Hello CMake CMake 是一个用于配置跨平台源代码项目应该如何配置的工具建立在给定的平台上。 ├── CMakeLists.txt # 希望运行的 CMake命令 ├── main.cpp # 带有main 的源文件 ├── include # 头文件目录 …

【C++】多态(上) 多态 | 虚函数 | 重写 | final、override | 接口继承与实现继承 | 抽象类

一、多态 概念 多态&#xff0c;就是多种状态&#xff0c;即不同的对象去完成同一个行为时会产生出不同的状态。比如&#xff1a;买票时&#xff0c;成人要原价买&#xff0c;学生和老人就可以享受优惠价便宜一点儿。同样是买票这个行为&#xff0c;不同的对象来做就有不同的…

招募引流模式是实体门店吸引顾客的一种有效策略

在如今激烈的市场竞争和庞大的客户需求中&#xff0c;应该采取什么样的方式来应对&#xff0c;才能找到自己的一席之地。招募引流模式是实体门店吸引顾客的一种有效策略&#xff0c;通常招募体验官或合作伙伴&#xff0c;让他们协助门店进行推广活动&#xff0c;达到增加客流量…

Go——三、运算符以及流程控制

Go 一、Go语言运算符1、算数运算符2、关系运算符3、逻辑运算符4、位运算符5、赋值运算符6、其他运算符7、运算符优先级 二、Go的流程控制1、if else2、for 循环结构3、for range&#xff08;键值循环&#xff09;4、switch case5、break&#xff1a;跳出循环6、go&#xff1a;跳…

AIGC系列之:DDPM原理解读(简单易懂版)

目录 DDPM基本原理 DDPM中的Unet模块 Unet模块介绍 Unet流程示意图 DownBlock和UpBlock MiddleBlock 文生图模型的一般公式 总结 本文部分内容参考文章&#xff1a;https://juejin.cn/post/7251391372394053691&#xff0c;https://zhuanlan.zhihu.com/p/563661713&…