【Java EE 初阶】线程池简介及实现过程

news2024/11/15 4:03:43

目录

1.线程池是什么?

2.为什么要使用线程池?

 3.如何使用线程池

1.JDK给我们提供了一些方法来创造线程池

4.设计模式之工厂模式

1.工厂模式用途

5.自定义一个线程池

1.可以提交任务到线程池,那么就会有一种数据结构来保存我们提交的任务

2.创建线程池是需要指定初始线程数量,这些线程不停的扫描阻塞队列,如果有任务就立即执行

3.实现过程

6.创建线程池时方法构造的参数及含义?

 7.线程池的工作原理?(七个参数是如何搭配使用的)

​编辑

 8.拒绝策略(四种方式)

9.为什么不推荐使用系统自带的线程池?

1.使用了无界队列,可能会有系统资源耗尽的情况

2.临时线程无法控制,也会有系统资源耗尽的情况发生

10.创建线程池时,核心线程数目指定多少合适?


1.线程池是什么?

  • 线程池就是用来存放线程的一个池子
  • 当程序启动的时候就创建出若干个线程
  • 有任务就处理,没有任务就阻塞等待

比如在JDBC编程中,通过DataSource获取Connectoin的时候就已经用到了池的概念

271196efd16343adb3d441acb59cde74.png

2.为什么要使用线程池?

为了减少系统资源的开销

e72658b7e5f744c9b57d7cb1ce683350.png

线程池的作用就是为了减少这些关于申请与释放PCB的操作,尽量保证我们的程序在用户态执行

 3.如何使用线程池

1.JDK给我们提供了一些方法来创造线程池

9b5572c5261248a197ad3d110579a1d6.png

无界队列,指的是对于队列中元素的个数不加以限制,可能会出现内存被消耗殆尽的情况

4.设计模式之工厂模式

1.工厂模式用途

解决构造方法创建对象的不足

5.自定义一个线程池

1.可以提交任务到线程池,那么就会有一种数据结构来保存我们提交的任务

可以用阻塞队列来实现

2.创建线程池是需要指定初始线程数量,这些线程不停的扫描阻塞队列,如果有任务就立即执行

可以用线程池的构造方法,接收要创建线程的数据

3.实现过程

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

public class MyThreadPoll {
    //定义一个阻塞队列来存放线程
    BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>(3);

    //对外提供方法,用来提交任务
    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }
    //构造方法初始化线程
    public MyThreadPoll(int compacity){
        if(compacity <= 0) {
            throw new RuntimeException("初始线程任务不可以小于1");
        }
        //创建线程不停扫描任务
        for (int i = 0; i < compacity; i++) {
            Thread thread = new Thread(() -> {
                while (true) {
                    try {
                        Runnable take = queue.take();
                        take.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            //启动线程
            thread.start();
        }
    }

}

6.创建线程池时方法构造的参数及含义?

 1.int corePoolSize:核心线程数,创建线程时包含的最小线程数量

int maximumPoolSize: 最大线程数,也叫临时线程数,允许系统可以创建的最多线程数量

long keepAliveTime:临时线程空闲的时长

TimeUnit unit:空闲的时间单位,与keepAliveTime一起使用

BlockingQueue<Runnable> workQueue:用来保存任务的阻塞队列

 7.线程池的工作原理?(七个参数是如何搭配使用的)

 8.拒绝策略(四种方式)

9.为什么不推荐使用系统自带的线程池?

1.使用了无界队列,可能会有系统资源耗尽的情况

2.临时线程无法控制,也会有系统资源耗尽的情况发生

10.创建线程池时,核心线程数目指定多少合适?

 

 

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

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

相关文章

java lambda表达式详解

一、Lambda初识 我们知道&#xff0c;在Java中&#xff0c;接口是不能实例化的&#xff0c;但是接口对象可以指向它的实现类对象。如果接口连实现对象都没有呢&#xff1f;那还可以使用匿名类的方式&#xff0c;如下: public class JavaTest { public static void main(Strin…

jenkins,gitlab,实时构建推送

首先jdk&#xff0c;jenkins安装好&#xff0c;新版jenkins不支持jdk8 然后安装环境maven&#xff0c;git 环境配置 插件安装 gitlab插件 Build Authorization Token Root插件 插件环境整好之后新建个任务 源码管理&#xff0c;填入仓库https地址&#xff0c;添加git…

大势智慧软硬件技术答疑第一期

1.重建大师生成的实景三维模型&#xff0c;模型周边的道路植物被压平了&#xff0c;怎么保留植物道路原有形状&#xff1f; 答&#xff1a;这个是单体化生成的地理实体场景&#xff0c;会把地物压平&#xff0c;可以用模方将单体化的模型加入到osgb中。 2.直接导入空三的话这个…

采用docker部署时kafka共享zookeeper的网络配置

采用docker部署kafka、zookeeper&#xff0c;一般的做法是创建一个docker网络&#xff0c;然后kafka、zookeeper都使用这个网络。问题是&#xff0c;我部署到生产环境的时候&#xff0c;这种做法被禁止了。原因是添加了这个docker网络以后&#xff0c;服务器就无法访问了。该服…

Es读写调优、深度分页

写入 ES支持四种对文档的数据写操作 create&#xff1a;如果在PUT数据的时候当前数据已经存在&#xff0c;则数据会被覆盖&#xff0c;如果在PUT的时候加上操作类型create&#xff0c;此时如果数据已存在则会返回失败&#xff0c;因为已经强制指定了操作类型为create&#xf…

Spring核心 AOP

1.什么是AOP&#xff1f; AOP&#xff08;Aspect Orient Programming&#xff09;&#xff0c;直译过来就是面向切面编程。AOP是一种编程思想&#xff0c;是面向对象编程&#xff08;OOP&#xff09;的一种补充。面向对象编程将程序抽象成各个层次的对象&#xff0c;而面向切面…

【笔试强训选择题】Day9.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…

open3d Image和numpy互转,PointCloud和numpy互转

目录 1. open3d.geometry.Image转numpy 2. numpy 转 open3d.geometry.Image 3. numpy转PointCloud 4. PointCloud转numpy 1. open3d.geometry.Image转numpy np_x np.asarray(x) # (h,w,3) import numpy as np import matplotlib.pyplot as plt import matplotlib.image…

鸿蒙Hi3861学习十-Huawei LiteOS-M(消息队列)

一、简介 消息队列&#xff0c;是一种常用于任务间通信的数据结构&#xff0c;实现了接收来自任务或中断的不固定长度的消息&#xff0c;并根据不同的接口选择传递消息是否存放在自己空间。任务能够从队列里面读取消息&#xff0c;当队列中的消息是空时&#xff0c;挂起读取任务…

EC6108V9/V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包

EC6108V9&#xff0f;V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软…

C#学习笔记--实现一个可以重复权重并且能够自动排序的容器--MultiplySortedSet

目录 前言SortedSetC#自带类型自定义类SortedSet权值重复 需求自定义容器 -- MultiplySortedSet核心实现思路 MultiplySortedSet 使用C#自带类型自定义类 前言 最近需要在C#中实现一个功能 有一个容器&#xff0c;该容器能自动对里面的元素进行排序&#xff0c;类似C的优先队列…

fast中user_id如何显示user表中的名称_关联模型

问题&#xff1a;编辑框内的user_id显示的是nickname 列表里如何显示nickname或是username 解决方案如下&#xff1a; 需要更改3个地方&#xff0c;控制器&#xff0c;模型&#xff0c;js文件 1.控制器index list($where, $sort, $order, $offset, $limit) $this->build…

ES6D: 利用对称性进行高效的6D姿态检测

利用对称性进行高效的6D姿态检测 本文参考自CVPR2022的这篇文章&#xff1a;ES6D: A Computation Efficient and Symmetry-Aware 6D Pose Regression Framework Github链接为&#xff1a;https://github.com/GANWANSHUI/ES6D 介绍 在6D姿态检测中&#xff0c;一些具备对称性的…

米哈游的春招实习面经,问的很基础

米哈游的春招实习面经&#xff0c;主要考察了java操作系统mysql网络&#xff0c;这四个方面。 面试流程&#xff0c;共1小时&#xff0c;1min自我介绍&#xff0c;20min写题&#xff0c;剩下问题基础知识。 Java String&#xff0c;StringBuilder&#xff0c; StringBuffer区…

注意力模型

如果拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解&#xff0c;比如输入的是英文句子&#xff1a;Tom chase Jerry&#xff0c;Encoder-Decoder框架逐步生成中文单词&#xff1a;“汤姆”&#xff0c;“追逐”&#xff0c;“杰瑞”。 在翻译“杰瑞”这个中文单词…

低代码/0代码(无代码)开发平台如何选型?这篇文章告诉你

随着数字化转型的加速&#xff0c;越来越多的企业开始寻求低代码或零代码开发平台来加速应用程序的开发和部署。选对合适的平台是至关重要的&#xff0c;因为这将决定企业能否在数字化转型中保持竞争优势。 市面上的低/零代码平台五花八门&#xff0c;在选型的时候需要考虑哪些…

搭建本地仓库源

一、如何搭建仓库源 之前讲了定制ISO的方法&#xff1a;使用chroot定制系统&#xff0c;但有时候我们想自定义的安装包不在上游的仓库源中&#xff0c;在我们本地应该怎么办呢&#xff1f;如果我们将deb包拷贝到iso目录再安装有点过于麻烦了&#xff0c;而且还可能需要手动处理…

Linux 常见命令与常见问题解决思路

Linux 常见命令 Linux 基础命令目录相关查看文件&#xff08;日志&#xff09;查看普通的文件查看压缩的文件 解压压缩Linux 系统调优topvmstatpidstatps vi/vim 编辑文件查找文件属性相关定时任务scp 复制文件和目录awk 分隔cutsort 与 uniq常见问题处理思路CPU 高系统平均负载…

数组存储与指针学习笔记(一)数据类型与存储、数据对齐、数据移植、typedef

数据类型与存储 一、数据类型与存储1.1 大端模式与小端模式1.2 有符号数和无符号数1.3 数据溢出1.4 数据类型转换 二、数据对齐2.1 为什么非要地址对齐2.2 结构体对齐2.3 联合体对齐 三、数据的可移植性四、Linux内核中的size_t类型五、typedef5.1 typedef的基本用法5.2 typede…

python操作集合

# 集合 l{1,2,1} print(l) sset(range(5)) print(s)# 判断in 或 not in print(5 not in l) # 集合元素新增操作 l.add(4) l.update(1,3,6) print(l) l.update((1,3,5)) l.update([4,4,6]) # 删除集合元素 l.remove(2) l.discard(2) # 无目的的删除 自己不带参数 l.pop() l.cl…