java并发-线程池

news2024/11/15 7:36:30

java并发-线程池

线程池的介绍

Java线程池表示一组等待工作并多次重用的工作线程。在线程池的情况下,创建了一组固定大小的线程。服务提供者从线程池中拉出一个线程并分配一个作业。完成作业后,线程再次包含在线程池中。

使用线程池可以节省多线程应用程序中的资源,同时加快响应速度。线程池还可以指定线程的数量,避免线程过多

对每个任务都开一个线程的情况:

public class OneThread {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(new Task());
            thread.start();
        }
        
    }

    static class Task implements Runnable {

        @Override
        public void run() {
            System.out.println("finished");
        }
    }
}

/*
* finished
finished
finished
finished
finished
finished
finished
finished
finished
finished

Process finished with exit code 0

* */

这样开销太大,同时过多的线程会占用太多的内存

创建和停止线程池

构造函数参数

corePollSize和maxPollSize

corePollSize:核心线程数,线程池在完成初始化之后,默认情况下线程池中没有任何线程,线程池会等待有任务时,再创建新线程执行任务

maxPollSize:线程池有可能会在核心线程数的基础上,额外增加一些线程,但是新增加的线程有数量上限,就是maxPollSize

添加线程规则
  1. 如果线程数小于corePoolSize,即使其他工作线程处于空闲状态,也会创建以恶搞新线程来执行
    新任务
  2. 如果线程数大于等于corePoolSize,小于maxmumPoolSize,将任务放入队列(workQueue)
  3. 如果队列已满,线程数小于maxmumPoolSize,创建一个新线程来执行任务
  4. 如果队列已满,线程数大于等于maxPollSize,就会拒绝任务

请添加图片描述

  • 如果设置corePollSize和maxPollSize相同,就可以创建固定大小的线程池
  • 线程池希望保持较少的线程数,只有在负载变得很大的时候才会增加线程
  • 通过设置maxPollSize为很高的值,就可以允许线程池容纳任意数量的并发任务
  • 只有队列满的时候才会创建多于corePollSize的线程,如果队列无界,那么线程数就不会超过corePollSize

keepAliveTime

如果线程池当前的线程数多于corePollSize,多余的线程空闲时间超过keepAliveTime就会被终止

ThreadFactory

新的线程是由ThreadFactory创建的,默认创建出来的线程都在一个线程组,优先级为NORM_PRIORITY,不是守护线程

如果是自己指定ThreadFactory,就可以改变线程名、线程组、优先级以及是否是守护线程

workQueue

三种常见的队列:

  1. 直接交换:SynchronousQueue
  2. 无界队列:LinkedBlockingQueue
  3. 有界队列:ArrayBlockingQueue

创建线程池

  • newFixedThreadPool

使用LinkedBlockingQueue

传进去的LinkedBlockingQueue没有容量上限。当请求越来越多,并且没有及时处理完毕时,会占用大量内存,可能会导致OOM

  • newSingleThreadExcetor
  • 使用LinkedBlockingQueue

和newFixedThreadPool的原理基本一致,只是将线程数设置为了1,也会导致和newFixedThreadPool相同的内存问题

  • newCachedThreadPool

使用SynchronousQueue

可缓存线程,无界线程池,具有回收多余线程的功能

corePollSize被设置为Integer.MAX_VALUE,这会导致创建非常多的线程,可能会导致OOM

  • newScheduledTheadPool

使用DelayedWorkQueue

支持定时、周期性执行任务

线程数量的设定

  • CPU密集型(加密、计算hash):最佳线程数为CPU核心数的1-2倍
  • 耗时IO型(读写数据库、文件、网络读写):最佳线程数一般大于CPU核心数很多倍,因为CPU的速度大于外设的速度,会产生空闲。要以JVM线程监控繁忙情况为依据
  • 线程数=CPU核心数*(1+平均等待时间 / 平均工作时间)

停止线程池

  • shutdown

执行之后,会将线程池存在的任务以及队列中等待的任务都执行完毕再停止,同时再有新任务时直接拒绝

  • isShutdown

会返回一个布尔值,告诉我们线程池是不是已经停止了(是不是进入停止的状态了而不是完全停止)

  • isTerminated

会返回一个布尔值,告诉我们线程池是不是完全停止了

  • awaitTermination

这个方法不是停止线程的。是等待一段时间,在这段时间内,如果线程停止了,就返回true,否则,返回false

  • shutdownNow

立刻停止线程池。对于正在执行的线程,会进行interrupt;对于还在队列中等待的线程会直接返回

如果不了解interrupt,可以去看我写的这一篇文章:java多线程-线程的停止【interrupt】_java多线程interrupt_健鑫.的博客-CSDN博客

任务的拒绝(学习一下是如何拒绝的,用到生活中 doge)

拒绝的时机

  1. 当Executor关闭时,提交的新任务会被拒绝
  2. 当Executor对最大线程和工作队列的容量使用有限边界并饱和时会拒绝

拒绝的策略

  • AbortPolicy

抛出异常

  • DiscardPolicy

直接把任务仍了,不会通知,所以你不知道任务得没得到处理

  • DiscardOldestPolicy

将队列中最老的任务丢弃

  • CallerRunsPolicy

谁提交的任务谁跑,让提交任务的线程去执行(老子没空,你牛逼你自己来)

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

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

相关文章

Revit中如何绘制四面倾斜的屋顶?

一、Revit中如何绘制四面倾斜的屋顶&#xff1f; 如下图所示&#xff0c;像这种坡屋顶有两种方法进行绘制。具体操作如下。 第一种&#xff1a;定义坡度。 1、点击建筑选项卡中的屋顶按钮。 2、选择使用矩形工具。将偏移值修改为500。将屋顶迹线绘制出来。 3、选中全部屋顶迹…

信号浪涌保护器SPD选型方案

1.最大连续工作电压&#xff08;Uc&#xff09;&#xff1a;信号电路的最大电压必须小于Uc 最大连续工作电压Uc是最大工作信号电压&#xff0c;是电涌保护装置长期运行的信号电压或直流电压的最大有效值。这也是在额定漏电流条件下线与线之间或线与地之间的最大电压&#xff0…

UFT常用检查点的使用

录制时Flight自动打开。创建三个Action,分别命名为01_Login/02_New Order/03_Logout&#xff0c; 在Action里录制对应的Login/New Order/Logout操作。用飞机票预定系统订票&#xff0c;在02_New Order中设置起飞和到达城市参数化&#xff0c;用本地表数据&#xff08;至少2组数…

【排序算法(二)】选择排序(直接选择排序堆排序)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录1、直接选择排序1.1 …

腾讯云轻量应用服务器搭建网站教程(WordPress为例)

腾讯云轻量应用服务器搭建WordPress网站教程&#xff0c;先安装WordPress应用镜像&#xff0c;然后远程连接轻量应用服务器获取WP用户名和密码&#xff0c;域名DNS解析到轻量服务器IP地址&#xff0c;登陆WordPress后台管理全过程&#xff0c;腾讯云百科来详细说下腾讯云轻量服…

作用域、闭包的理解、GC算法

1、全局作用域的变量是不会自动的的释放掉的 例如在 <script >let title "hello world"function coming(){alter(title) }</script> 只要不关闭网页或者浏览器&#xff0c;我们都可以在控制台调用 2、作用域环境我们可以理解为一块内存数据 3、函数作…

研报精选230416

目录 【行业230416国联证券】汽车行业4月周报&#xff1a;上海车展期待值高&#xff0c;政策加码一体化压铸【行业230416国联证券】农林牧渔行业周报&#xff1a;低猪价加深去化幅度&#xff0c;高标准农田建设推进【个股230416安信证券_万华化学】Q1业绩超预期&#xff0c;TDI…

靶机精讲之Prime

主机发现 192靶机 扫描靶机 进行对端口的服务和版本的扫描 保存信息 扫描UDP 一般都是http优先然后再shh vuln脚本扫描 web渗透 查看源码 目录爆破 dirb 翻刚才扫到的目录 dirb指定文件类型扫描 读取文件 保存 浏览链接 wfuzz模糊测试 专门扫PHP 只有两目录 浏览页面 模糊…

react2:children属性 - props进阶 - 生命周期

children属性&#xff1a;父想给子组件传递内容&#xff0c;都需要通过children占位 children属性&#xff1a;类似vue中的slot效果 props 类型验证 &#xff1a;现在都是 typescript 替代了 ref 放普通标签上可以获取dom节点 ref 放组件上获取组件实例&#xff0c;可以调用组件…

「C/C++」C/C++内存四大分区

博客主页&#xff1a;何曾参静谧的博客 文章专栏&#xff1a;「C/C」C/C学习 目录术语一、文本区&#xff08;Text Segment&#xff09;/ 代码区二、数据区&#xff08;Data Segment&#xff09;/ 全局区三、栈区&#xff08;Stack Segment&#xff09;四、堆区&#xff08;Hea…

Redis应用问题解决

16. Redis应用问题解决 16.1 缓存穿透 16.1.1 问题描述 key对应的数据在数据源并不存在&#xff0c;每次针对此key的请求从缓存获取不到&#xff0c;请求都会压到数据源&#xff0c;从而可能压垮数据源。比如用一个不存在的用户id获取用户信息&#xff0c;不论缓存还是数据库…

美元霸权的潜在风险——无锚货币,为什么都要刺激消费

第三章 美元体系的风险结构与定价 金句导读 结果平等 没有智慧&#xff0c;优胜劣汰 没有良心。竞争都不充分。 年轻人有出路&#xff0c;穷人有活路&#xff0c;先富起来的人才能有后路。 名词解释&#xff1a; 对冲风险&#xff1a;我是卖面包的的&#xff0c;我还囤很多面…

【持续更新篇】SLAM视觉特征点汇总+ORB特征点+VINS前端

Harris角点 opencv函数 cornerHarris提取输入图像的Harris角点 检测原理 检测思想&#xff1a;使用一个固定窗口在图像上进行任意方向的滑动&#xff0c;对比滑动前后的窗口中的像素灰度变化程度&#xff0c;如果存在任意方向上的滑动&#xff0c;都有较大灰度变化&#xf…

Jetpack Compose 实战 宝可梦图鉴

文章目录前言实现效果一、架构介绍二、一些的功能点的介绍加载图片并获取主色,再讲主色设置为背景一个进度缓慢增加的圆形进度条单Activity使用navigation跳转Compose可组合项返回时页面重组的问题hiltViewModel()主要参考项目总结前言 阅读本文需要一定compose基础&#xff0…

Python爬虫|全国补充耕地项目数量爬取与分析——多进程案例

一、使用的库 import requests from lxml import etree import time import random import re import openpyxl import openpyxl from pyecharts.charts import Bar, Pie from pyecharts import options as opts from multiprocessing.dummy import Pool 二、数据爬取思路 1…

手拉手Centos7安装配置Redis7

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 Redis是一个NoSQL数据库&#xff0c;常用缓存(cache) Re…

Spark 安装及WordCount编写(Spark、Scala、java三种方法)

Spark 官网&#xff1a;Apache Spark™ - Unified Engine for large-scale data analytics Spark RDD介绍官网&#xff1a;https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.rdd.RDD 下载好spark解压mv到软件目录 linux>mv spark-xxx-xxx /op…

统计套利策略

统计套利策略套利策略跨品种套利标的择时风控套利策略 套利是&#xff0c;某种商品在&#xff08;在同一市场或不同市场&#xff09;拥有两个价格的情况下&#xff0c;以较低的价格买进&#xff0c;较高的价格卖出&#xff0c;从而实现获利的交易方式。 比如咖啡店里有小杯、…

【jvm系列-04】精通运行时数据区共享区域---堆

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…

chapter-6数据库设计原则

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 数据库设计 数据库设计是基于应用系统需求分析中对数据的需求&#xff0c;解决数据的抽象、数据的表达和数据的存储等问题&#xff0c;其目标是设计出一个满足应用要求&#xff0c;简洁、高效、规范…