java线程-线程池

news2024/9/20 3:31:15

简介

在这里插入图片描述

工作原理

在这里插入图片描述

如何获取线程池对象

在这里插入图片描述

构造器的参数含义

在这里插入图片描述

注意事项

在这里插入图片描述

构造器-ThreadPoolExecutor

//  ArrayBlockingQueue 是一个有界的阻塞队列,它的内部实现是一个数组。有界的意思是它的容量是有限的,我们必须在创建 ArrayBlockingQueue 实例的时候指定容量大小。
//  Executors.defaultThreadFactory() 是一个线程工厂,它的作用是创建一个新的线程。这个线程工厂创建的线程都是普通优先级、非守护、正常终止的线程。
//  ThreadPoolExecutor.AbortPolicy() 是拒绝策略,当线程池中的线程数量达到最大线程数并且阻塞队列已满的情况下,新提交的任务会被拒绝,并抛出 RejectedExecutionException 异常。
ExecutorService pool =  new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS,
        new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

线程池处理Runnable任务

常用API

在这里插入图片描述

代码实现

ExecutorService pool =  new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS,
         new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());


// 当任务的实际数量> 核心线程 + 阻塞队列的容量时,会创建临时线程       8 > 3 + 4
// 当任务的实际数量 > 最大线程数 + 阻塞队列的容量时,会抛出异常    10 > 5 + 4    
for (int i = 0; i < 8; i++) {
    //提交任务
    pool.execute(myRunnable);
}

 //关闭线程池 很少使用,尽量不用,我们应该保持线程池的长期运行,除非我们确定不再需要线程池。
 pool.shutdown();
public class MyRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " is running");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

临时线程的创建时机

  • 当任务的实际数量> 核心线程 + 阻塞队列的容量时,会创建临时线程 8 > 3 + 4
  • 当任务的实际数量 > 最大线程数 + 阻塞队列的容量时,会抛出异常 10 > 5 + 4

新任务的拒绝策略

在这里插入图片描述

线程池调用Callable

比较

  • 调用Runnable使用的execute方法
  • 调用Callable使用的是submit方法

代码实现

//  创建线程池
ExecutorService pool =  new ThreadPoolExecutor(3, 5, 8, TimeUnit.SECONDS,
        new ArrayBlockingQueue<>(4), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());

//创建Callable任务
MyCallable myCallable = new MyCallable();
for (int i = 0; i < 8; i++) {
    //提交任务
    Future<String> future = pool.submit(myCallable);
    try {
        //获取任务执行结果
        System.out.println(future.get());
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }
}
public class MyCallable implements Callable<String> {
    @Override
    public String call() throws Exception {
        System.out.println(Thread.currentThread().getName() + " is running");
        Thread.sleep(1000);
        return "success";
    }
}

使用工具类创建线程池Excutors

创建API

在这里插入图片描述

##代码

 //  创建线程池
        ExecutorService pool =  Executors.newFixedThreadPool(5);

        //创建Callable任务
        MyCallable myCallable = new MyCallable();
        for (int i = 0; i < 8; i++) {
            //提交任务
            Future<String> future = pool.submit(myCallable);
            try {
                //获取任务执行结果
                System.out.println(future.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        } 

核心线程数量

  • 计算密集型任务:大部分时间是计算机使用cpu进行计算
  • IO密集型任务:大部分时间是IO流输入输出
  • 计算密集型任务:核心线程数量 = CPU + 1
  • IO密集型任务:核心线程数量 = CPU * 2

注意事项

在这里插入图片描述

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

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

相关文章

IMUGNSS的误差状态卡尔曼滤波器(ESKF)---更新过程

IMU&GNSS的误差状态卡尔曼滤波器&#xff08;ESKF&#xff09;---更新过程 ESKF的更新过程 ESKF的更新过程 前面介绍的是ESKF的运动过程&#xff0c;现在考虑更新过程。假设一个抽象的传感器能够对状态变量产生观测&#xff0c;其观测方程为抽象的h,那么可以写为 其中z为…

科研基础与工具(论文搜索)

免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 搜索论文 Google Scholar 谷歌学术 涵盖面太全了&#xff0c;都收录&#xff0c;就会有很多低质量的论文…

NodeRed节点编辑用于边缘计算和规则引擎,能做带UI界面和业务逻辑的上位机或前端应用吗?

先说结论&#xff0c;可以&#xff0c;但是需要有页面嵌套继承类似的技术&#xff0c;实现页面模块化封装&#xff0c;否则难以实现复杂应用。 相信目光敏锐的人都在关注节点编辑在自身行业的应用&#xff01; NodeRed在边缘计算做数据协议解析、以及物联网平台中作为规则链引…

算法训练营day13

一、SlidingWindowMaximum(滑动窗口最大值) 前置题&#xff0c;155.最小栈 参考K神155. 最小栈 - 力扣&#xff08;LeetCode&#xff09; 做完最小栈的题能更好的理解这道题 鄙人想到了开辟空间来保存最小值&#xff0c;使用的HashMap&#xff1b;K神用的是栈逻辑优化 cla…

网盘_游戏_博客自动化部署(Nginx多项目部署)

目录 一.前提介绍 二.环境介绍 三.自述&#xff08;脚本&#xff09; 四.关于Nginx多项目部署 一.前提介绍 在我之前的博客里详细介绍了上述项目的部署&#xff0c;那么如何使用简单脚本自动部署和使用Nginx多项目部署是本文来介绍的基础篇章。 二.环境介绍 CentOS Linux…

吴恩达深度学习 (week5,6)

文章目录 一、训练开发测试集二、机器学习基础三、 正则化初步介绍四、Dropout 正则化五、其他正则化方法六、归一化输入介绍七、梯度消失与梯度爆炸八、神经网络的权重初始化九、梯度数值逼近和检验十、上述学习总结第一题 划分训练/开发/测试集第二题 开发和测试集分布第三题…

gradle安装和部署

准备工作 下载地址&#xff1a;https://gradle.org/releases/ 安装和配置环境变量 将压缩包解压到/usr/local/目录下 unzip gradle-8.7-bin.zip -d /usr/local/找到gradle的安装目录/usr/local/gradle-8.7 编辑/etc/vi /etc/profileprofile配置环境变量&#xff08;这是ce…

duke liver datasets数据处理

Duke liver datasets 如果大家是做医学图像处理的&#xff0c;刚好又是做肝脏那边的&#xff0c;对这个数据集应该不会陌生 我发现网上现有的资料很少有说怎么读取这个数据集的&#xff0c;由于我之前一直都是做的nii格式的数据集&#xff0c;现在碰到了dicom格式的数据集页研…

SQLite导出数据库至sql文件

SQLite是一款实现了自包含、无服务器、零配置、事务性SQL数据库引擎的软件库。SQLite是世界上部署最广泛的SQL数据库引擎。 SQLite 是非常小的&#xff0c;是轻量级的&#xff0c;完全配置时小于 400KiB&#xff0c;省略可选功能配置时小于250KiB。 SQLite 源代码不受版权限制。…

分类神经网络3:DenseNet模型复现

目录 DenseNet网络架构 DenseNet部分实现代码 DenseNet网络架构 论文原址&#xff1a;https://arxiv.org/pdf/1608.06993.pdf 稠密连接神经网络&#xff08;DenseNet&#xff09;实质上是ResNet的进阶模型&#xff08;了解ResNet模型请点击&#xff09;&#xff0c;二者均是…

数字阅览室解决方案

一、方案概述 “数字阅览室”概念一经提出&#xff0c;就得到了广泛的关注&#xff0c;纷纷组织力量进行探讨、研究和开发&#xff0c;进行各种模型的试验。随着数字地球概念、技术、应用领域的发展&#xff0c;数字阅览室已成为数字地球家庭的成员&#xff0c;为信息高速公路…

Flowable 基本用法

一. 什么是Flowable Flowable 是一个基于 Java 的开源工作流引擎&#xff0c;用于实现和管理业务流程。它提供了强大的工作流引擎和一套丰富的工具&#xff0c;使开发人员能够轻松地建模、部署、执行和监控各种类型的业务流程。Flowable 是 Activiti 工作流引擎的一个分支&am…

LeetCode-电话号码的字母组合(回溯)

每日一题 今天刷到的是一道利用回溯来解决的题&#xff0c;不过稍微有点复杂&#xff0c;并且我也有一段时间没有做回溯了&#xff0c;所有在解题时也是思考了一段时间。 题目要求 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意…

常见现代卷积神经网络(ResNet, DenseNet)(Pytorch 11)

一 批量规范化&#xff08;batch normalization&#xff09; 训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。批量规范化&#xff08;batch normalization&#xff09;是一种流行且有效的技术&#xff0c;可持续加速深层网络的收敛速度。 …

网络原理-UDP和TCP

在传输层中有两个非常重要的协议&#xff0c;UDP和TCP&#xff0c;现在就来研究一下这两个协议。 UDP 报文格式 我们观察可以发现&#xff0c;里面UDP报文长度为2个字节&#xff0c;那么是多少呢&#xff1f;我们需要快速反应如下固定字节数据类型的取值范围&#xff1a; 字…

【融合ChatGPT等AI模型】Python-GEE遥感云大数据分析、管理与可视化及多领域应用

随着航空、航天、近地空间遥感平台的持续发展&#xff0c;遥感技术近年来取得显著进步。遥感数据的空间、时间、光谱分辨率及数据量均大幅提升&#xff0c;呈现出大数据特征。这为相关研究带来了新机遇&#xff0c;但同时也带来巨大挑战。传统的工作站和服务器已无法满足大区域…

anaconda配置的环境对应的地址查看,环境安装位置

打开conda指令窗口 这个和上面的都一样&#xff0c;哪个都行 点开后&#xff0c;输入 conda env list 这里显示的就是自己的每个环境对应的地址了

python_4

def reverse(number):a str(number) # 将输入的数字转成字符串print(f"反向输出:{a[::-1]}") # 将字符串通过切片反向输出number int(input("输入整数:")) reverse(number)import mathdef isValid(side1, side2, side3):# 根据"两边之和大于第三边…

安装mmsegmentation默认主分支main

安装时间2024.4.21 mmsegmentation新版本main分支&#xff08;v1.2.2&#xff09; 安装过程 conda create --name openmmlab python3.8 -y conda activate openmmlab// 很关键&#xff0c;可以避免mmcv版本问题 pip install torch1.10.1cu113 torchvision0.11.2cu113 torcha…

明日周刊-第7期

转眼间就又快到了五一假期&#xff0c;小长假有什么计划吗。封面配图是杭州高架上的月季花&#xff0c;非常好看。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 鸿蒙系统持续扩大影响力&#xff1a;近期&#xff0c;华为官方宣布广东省已有超过600款应用加入鸿蒙系统&…