多线程-线程池(一分钟快速了解)

目录

1.什么是线程池

2.标准库中的线程池

 2.1各个参数什么意思

  int corePoolSize:

   int maximumPoolSize:

   keepAliveTime:

  BlockingQueue workQueue:

   ThradFactory  threadFactory  :线程工厂

 RejectedExecutionHandler handler:(面试可能会问)

3.实现一个线程池


1.什么是线程池

    线程池是一种管理和复用线程的机制。它通过预先创建一组线程并维护它们的生命周期,以便在需要时重复使用这些线程,可以减少线程创建和销毁的开销。

为什么要用线程池呢

        在我们使用多线程进行开发编程的时候,使用多线程确实可以进行并发编程,但是频繁的创建和销毁线程会消耗很多的资源,开销较大。所以我们引入线程池,将需要用的线程,在线程池中准备好,用的时候从线程池中拿,用完又放回到线程池中。这样就可以减小开销。

2.标准库中的线程池

     在标准库中我们用ThreadPoolExecutor类来表示线程池。ThreadPoolExecutor 提供了更多的可选参数, 可以进⼀步细化线程池⾏为的设定.

 2.1各个参数什么意思

  int corePoolSize

        核心线程数。就像在一家公司里的正式员工,。当你被录用了后,就不会被辞退。对公司来说很重要。核心线程数也是一样,在一个进程里是非常重要的。

   int maximumPoolSize

最大线程数。就像是一家公司里的正式员工+实习生。实习生⼀段时间不⼲活, 就被辞退。

   keepAliveTime:

       保持存活时间。就像实习生允许的空闲时间.如果实习生空闲时间超过这个时间就会被辞退。在线程里就表示线程空闲的时间。超过这个时间就会被销毁。

  BlockingQueue<Runnable> workQueue

  和定时器类似,线程池中可以持有很多任务。以Runnable为对象。

   ThradFactory  threadFactory  :线程工厂

        线程工厂 通过这个工厂类来创建线程对象。线程工厂(Thread Factory)是用于创建线程的对象或方法。它提供了一种统一的方式来创建线程,并可以对线程进行自定义配置和初始化。线程工厂通常包含以下主要功能:

  1. 创建线程:线程工厂负责创建新的线程对象。通过线程工厂,可以使用特定的方式创建线程,例如设置线程的名称、优先级、线程组等属性。

  2. 配置线程:线程工厂允许对线程进行自定义配置和初始化。可以在创建线程时指定线程的运行环境、上下文、异常处理器等。

  3. 线程命名:线程工厂可以为创建的线程设置一个有意义的名称,以便在日志和调试中更好地追踪和识别线程。

        线程工厂的作用是封装线程的创建过程,提供了一种可扩展和可定制的方式来创建线程。通过使用线程工厂,可以对线程进行统一管理和配置,使得线程的创建和使用更加灵活和可控。

 RejectedExecutionHandler handler:(面试可能会问)

    拒绝策略  在一个线程池中,有一个阻塞队列。能够容纳的元素有上限的,当任务队列满了,如果再往里加任务时,就会用到拒绝策略。

 第一个策略: 继续添加任务时,会抛异常。新任务和旧任务都不运行了。

 第二个策略:继续添加任务时,会抛异常。新的任务,由添加新任务的线程来执行。谁添加谁来执行。

 第三个策略:继续添加任务时,会抛异常。旧的任务不执行了。执行新的任务。 

 第四个策略:继续添加任务时,会抛异常。丢弃最新的任务,新任务不会执行。

 用标准库:

ExecutorService pool = Executors.newFixedThreadPool(10);
pool.submit(new Runnable() {@Overridepublic void run() {System.out.println("hello");}
});

3.实现一个线程池

代码:

package 多线程;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;class MyThreadPoolExecutor{private List<Thread> threadList = new ArrayList<>();//就是一个用来保存任务的队列。private BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>(1000);//通过 n 指定创建多少个线程public MyThreadPoolExecutor(int n){for (int i = 0; i < n; i++) {Thread t  = new Thread(()->{//线程要做的事情就是吧任务队列中的任务不停的取出来,并且进行执行while (true){try {//此处的 take 带有阻塞功能的//如果队列为空,此处 的 take 就会阻塞Runnable runnable =  queue.take();//取出一个任务就执行一个任务runnable.run();} catch (InterruptedException e) {e.printStackTrace();}}});t.start();threadList.add(t);}}public void submit(Runnable runnable) throws InterruptedException{queue.put(runnable);}}public class ThreadDemo26 {public static void main(String[] args) throws InterruptedException {MyThreadPoolExecutor executor = new MyThreadPoolExecutor(4);for (int i = 0; i < 1000; i++) {int n = i;executor.submit(new Runnable() {@Overridepublic void run() {System.out.println("执行任务" + n + "当前线程为:" + Thread.currentThread().getName());}});}}
}

 运行结果:我们可以看到任务不是按顺序执行的,因为当线程接到任务时,并不是立刻执行。所以任务3排到任务17后面去了。

 

                                              本期分享结束,希望大家多多支持!!! 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows如何安装Node.js环境并制作贪吃蛇小游戏分享好友远程访问

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

表格数据转成 HTML数据

一&#xff0c;先找到 要转换的表格数据 二&#xff0c;把表格数据添 复制 加到转换工具里 进行转换 零代码 - Table在线布局工具&#xff08;Excel转HTML&#xff09; 三&#xff0c;如果把下载的页面 添加到工具里边 就会发现HTML 代码

乐意购项目前端开发 #7

一、购物车 本地购物车 创建cartStore.js文件 创建cartStore.js文件, 将购物车列表数据存在pinia中 import { ref, computed } from "vue"; import { defineStore } from "pinia"; import { useUserStore } from "./user"; import {insertCart…

msvcp120.dll丢失如何解决/找不到msvcp120.dll的5种有效的解决方法

在计算机系统运行过程中&#xff0c;如果遇到“找不到msvcp120.dll”的提示信息&#xff0c;这代表了何种具体状况呢&#xff1f;首先&#xff0c;我们需要明确msvcp120.dll文件的重要性。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;这是一…

这一年让我印象深刻的bug --外部接口请求失败问题

1 业务场景 我们有个需求是外部客户需要在我们系统创建一个账号。业务流程如下 但是我们运行一段时间后发现一个问题&#xff0c;有客户反创建客户账号时&#xff0c;提示账号已经存在&#xff0c;但是我们系统却查不到单号 2 问题分析 经分析报错来源于权限系统&#xff0c;我…

chisel之scala 语法

Chisel新手教程之Scala语言&#xff08;1&#xff09; Value & variable Value是immutable的&#xff0c;当它被分配一个数据后&#xff0c;无法进行重新分配。用 val 表示。 Variable是mutable的&#xff0c;可以重复赋值。用 var 表示。示例如下&#xff1a; val a …

python_蓝桥杯刷题记录_笔记_全AC代码_入门4

题单目录 1.P1914 小书童——凯撒密码 2.P1028 [NOIP2001 普及组] 数的计算 3.P1036 [NOIP2002 普及组] 选数 4.P1149 [NOIP2008 提高组] 火柴棒等式 5.P1217 [USACO1.5] 回文质数 Prime Palindromes 6.P1478 陶陶摘苹果&#xff08;升级版&#xff09; 7.P1618 三连击&…

如何训练自己的模型

无论数据类型或目标如何&#xff0c;用于训练和使用 AutoML 模型的工作流都是相同的&#xff1a; 准备训练数据。 我们需要将需要训练的数据准备为jsonl格式&#xff0c;这种格式的特点就是每一行都是json的格式 {"prompt": "<prompt text>", "…

UE5动画源码剖析

重点剖析的类&#xff1a; UAnimationInstanceFAnimInstanceProxy 参考&#xff1a;https://zhuanlan.zhihu.com/p/405437842 参考&#xff1a;https://blog.csdn.net/qq_23030843/article/details/109103433 参考&#xff1a;https://ikrima.dev/ue4guide/gameplay-programm…

全网第一篇把Nacos配置中心客户端讲明白的

入口 我们依旧拿ConfigExample作为入口 public class ConfigExample {public static void main(String[] args) throws NacosException, InterruptedException {String serverAddr "localhost";String dataId "test";String group "DEFAULT_GROU…

react 之 useInperativeHandle

useInperativeHandle是通过ref暴露子组件中的方法 1.场景说明-直接调用子组件内部的方法 import { forwardRef, useImperativeHandle, useRef } from "react"// 子组件const Son forwardRef((props, ref) > {// 实现聚焦逻辑const inputRef useRef(null)const …

超多制作模板的姓氏头像生成器微信小程序源码

超多制作模板的姓氏头像生成器微信小程序源码&#xff0c;这是一款姓氏头像制作小工具&#xff0c;内含丰富多样的模板提供制作。 以前的基本是固定位置生成&#xff0c;这款制作支持拖拽调整位置&#xff0c;自定义颜色&#xff0c;阴影等等。