【经典】JAVA线程池

2023-11-18

JAVA多线程的五个状态:

Running:运行态,该状态下线程池能够接受新的任务

Shutdown:该状态下不接受新的任务,但会继续处理已经添加的任务。

Stop:该状态下不接受新的任务,并且会中断正在执行的任务,同时删除未处理的任务;

Tidying:指当前所有的任务已经停止;

Terminated:该状态表示线程池彻底停止。

 

多线程创建方法一

JAVA中我们用JUC包下的ThreadPoolExecutor来创建线程池,ThreadPoolExecutor提供了四个构造方法:

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)


public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)


public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)


public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

其中:

corePoolSize:指线程池的容量大小;如果调用prestartAllCoreThreads(),则会提前初始化所以线程。

maximumPoolSize:指线程最大数;如果corePoolSize满时会创建线程直到线程数等于maximumPoolSize;如果线程数等于maximumPoolSize后,下一个任务将被添加到线程等待队列(第五个参数);

keepAliveTime:指线程存活时间

timeUnit:存活时间的单位

BlockingQueue<Runnable> workQueue:线程等待队列类型;

BlockingQueue,有以下几种

ArrayBlockingQueue,必须制定长度,其底层只用一个锁,同一时间点上,只能有一个入队或出队的操作;

LinkedBlockingQueue,默认长度的Integer的最大值,底层维护着两把锁,一个用于入队,一个用于出队;

SynchronousQueue, 没有容量的无缓冲等待队列,当有任务时它直接将任务交给消费者。

DelayedWordQueue, 无界的延时队列,即可以指定队列里的任务被延时消费。

依据数组和链接的特点,可以适当选择;

因为很多业务都是出入队列高并发,所以大多数情况下,LinkedBlockingQueue一般情况下效率比ArrayBlockingQueue效率高;

ThreadFactory:线程工程,在创建线程时候用到;可以通过Executors.defaulThreadFactory()获取;

RejectedExecutionHandler:拒绝策略;当线程队列满时(线程大于maximunPoolSize,且workQueue满时),新进来的任务要这么处理;默认是AbortPolicy,即直接抛异常;

RejectedExecutionHandler包含:

       1、AbortPolicy,默认的拒绝策略,即抛异常;

       2、CallerRunsPolicy,调用者所在的线程来执行,不一定是主线程,有可能是线程掉线程;

       3、DiscardOldestPolicy,丢弃队列中最老的任务,并执行当前任务;

       4、DiscardPolicy,直接丢弃新任务;

拒绝策略是ThreadPoolExecutor的内部类,需要时使用,new ThreadPoolExecutor.AbortPolicy();

也可以自定义拒绝策略:实现RejectedExecutionHandler;

 

 多线程的创建方法二

  该方式也是官方推荐的:

 FixedThreadPool:必须指定线程数CoreSize,coreSize==maximumPoolSize ,底层用的是基于链表的队列;

  Executors.newFixedThreadPool(int coreSize) : 

  Executors.newFixedThreadPool(int coreSize, ThreadFactory threadFacotry)

 

  CachedThreadPool: 默认coreSize=0;maximumPoolSize=Integer.MAX_VALUE; 底层是SychronousQueue无缓冲队列

  Executors.newCachedThreadPool(); 

  Executors.newCachedThreadPool(ThreadFactory threadFacory);

 

 ScheduledThreadPool:必须指定coreSize;  maximumPoolSize=Integer.MAX_VALUE;底层使用的是DelayedWorkQueue延迟队列。

 Executors.newScheduledThreadPool(int coreSize);

 Executors.newScheduledThreadPool(int coreSize, ThreadFactory threadFactory);

 

SingleThreadExecutor:和FixedThreadPool一样,只是coreSize=1;(不常用)

SingleThreadScheduledExecutor:即是延时单例的;(不常用)

 

  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【经典】JAVA线程池 的相关文章

随机推荐

  • 安装Miniconda+python3.9开发环境

    因为如果你直接通过系统的Python环境开发项目的话 每一个项目下 都需要安装相应的模块环境 所以我这边推荐用Miniconda 通过这个可以大大减小磁盘的利用空间 毕竟开发时一个torch模块已经有一两个G了 多次下载浪费空间 一 下载并
  • oracle数据导入导出

    创建一个目录用来存导出的数据和log 数据所在的机器的目录 SQL gt create directory exp dir1 as home tyc 导出 oracle gzsw3 expdp sys 密码 tns配置中的实例名 schem
  • maven执行失败(mvn clean package)

    开发环境 sh all sh 诡异 build faild 在默认配置下 当Maven项目比较大 运行诸如 mvn clean package 的命令是需要很多的内存的并且会导致失败退出 在架构师哥的帮助下 通过设置maven的运行环境堆大
  • 对于前端开发在vs code中编写后出现的Cannot find module 'crypto-js/hmac-sha256.js'.报错

    移植了老师的代码 出现了该问题 应该是js加密的问题 而本机中并没有使用过js加密 所以并没有该包的原因 遵循没有就安装的方式进行解决 1 直接安装该包 网上大多数都是这个方法 命令行代码如下 npm install crypto js 跟
  • 老胡的周刊(第107期)

    老胡的信息周刊 1 记录这周我看到的有价值的信息 主要针对计算机领域 内容主题极大程度被我个人喜好主导 这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享 项目 open interpreter 2 基于 LLM 为你提供一种新的
  • c99编译报错改用gnu99

    使用c99编译出警告信息 implicit declaration of function usleep 按常规来讲 出现 implicit declaration of function xxxx 是因为头文件未包含导致的 但是uslee
  • 在servlet中 PrintWriter out=response.getWriter()

    1 从HttpServletResponse中get一个PrintWriter 2 打个通俗的比方就是通过HttpServletResponse对象得到一支笔 然后就可以用out print 方法在网页上写任何你想显示的内容 out pri
  • extern “C“ __declspec(dllexport)是什么意思

    如果DLL是提供给VC 用户使用的 你只需要把编译DLL时产生的 lib提供给用户 它可以很轻松地调用你的DLL 但是如果你的DLL是供其他程序如VB delphi 以及 NET用户使用的 那么会产生一个小麻烦 因为VC 对于 declsp
  • Tensorflow初步之非线性回归

    神经网络 输入 1个神经元 中间层 10个神经元 输出 1个神经元 一 创造二次函数并加入噪声 import tensorflow as tf import matplotlib pyplot as plt import numpy as
  • 干货丨7款易上手C语言编程软件推荐

    C语言是一门历史很长的编程语言 其编译器和开发工具也多种多样 其开发工具包括编译器 现举几个开发工具供大家选择 当然也要根据自己的操作系统来选择适合自己的开发工具 好多刚开始接触c语言的朋友都想知道用上面软件开发c语言比较好 一般来说微软的
  • node版本升级:与node-sass、sass-loader版本不兼容问题

    npm WARN deprecated har validator 5 1 5 this library is no longer supported npm WARN deprecated uuid 3 4 0 Please upgrad
  • 浅谈人工智能:现状、任务、构架与统一

    浅谈人工智能 现状 任务 构架与统一 原创 2017 11 02 朱松纯 目录 引言 第一节 现状 正视现实 第二节 未来 一只乌鸦给我们的启示 第三节 历史 从 春秋五霸 到 战国六雄 第四节 统一 小数据 大任务 范式与认知构架 第五节
  • 《动手学深度学习 Pytorch版》 7.3 网络中的网络(NiN)

    LeNet AlexNet和VGG的设计模式都是先用卷积层与汇聚层提取特征 然后用全连接层对特征进行处理 AlexNet和VGG对LeNet的改进主要在于扩大和加深这两个模块 网络中的网络 NiN 则是在每个像素的通道上分别使用多层感知机
  • nginx 配置ssl后配置websockt

    1 前言 这里以Vue 和 nginx 1 22 0 为例 在nginx配置好ssl为前提下 2 代码 vue 连接路径 state ws new WebSocket wss ssl绑定域名 端口号 ws mediaToChatRoom 端
  • 一个参数一张Excel表,玩转Pandas的read_excel()表格读取

    作者 黄伟呢 来源 数据分析与统计学之美 我觉得很有必要讲述这个文章 进行数据处理的第一步就是Python数据读取 但是你可能没想到 在进行数据读取的同时 我们其实可以配合相关参数做很多事儿 这对于后续的数据处理都是极其有帮助 read e
  • 单元测试的策略

    1 逻辑覆盖 2 循环覆盖 3 同行评审 4 桌前检查 5 代码走查 6 代码评审 7 静态数据流分析 mock 对代码中某些不容易获取的对象创建虚拟对象来测试 stub 桩函数是代替某些被调用了但是没有编写代码 一般在增量迭代自低向上的过
  • Cloud Ace 进军南非——旨在将 Google Cloud 市场扩展到非洲最大的经济体

    本文由Cloud Ace整理发布 Cloud Ace是谷歌云全球战略合作伙伴 拥有 300 多名工程师 也是谷歌最高级别合作伙伴 多次获得 Google Cloud 合作伙伴奖 作为谷歌托管服务商 我们提供谷歌云 谷歌地图 谷歌办公套件 谷
  • [经验] 轻松解读PID控制算法的三种参数的自整定方法

    轻松解读PID控制算法的三种参数的自整定方法 机器人论坛 电子技术论坛 广受欢迎的专业电子论坛 elecfans com
  • MFC实用功能技术——窗口跳转

    MFC系列 0 MFC简易入门基础 1 MFC实用功能技术 窗口跳转 2 MFC实用功能技术 下拉列表添加值 实现的效果是从一个对话框 点击控件能跳转到另一个对话框 实现记录 看了很多别人的博客 要不是太简单自己不懂 要不是实现的有区别 所
  • 【经典】JAVA线程池

    JAVA多线程的五个状态 Running 运行态 该状态下线程池能够接受新的任务 Shutdown 该状态下不接受新的任务 但会继续处理已经添加的任务 Stop 该状态下不接受新的任务 并且会中断正在执行的任务 同时删除未处理的任务 Tid