有了ThreadPoolExecutor,还有Thread什么事

Java 捕获并处理线程异常:Thread线程异常捕获、ThreadPoolExecutor线程池异常捕获 Thread.UncaughtExceptionHandler捕获线程异常 ThreadPoolExecutor#afterExecute方法捕获线程池异常 以及两者实现的原理 阅读详情

1.线程池是什么

线程池类似于数据库连接池,由于Thread 运行start()方法时,会创建线程。每次创建线程,会给系统增加额外的开销,所以线程池产生。每次执行线程代码时候,直接从线程池中获取线程执行代码。

2.线程池的作用

  1.减少执行线程时,创建线程的额外开销(jvm中创建线程,需要创建虚拟机栈,本地方法栈等)。
  过多的线程,会给jvm造成很大的压力。
  2.销毁线程时,也会由于回收资源,消耗一定的性能。
  3.线程池提供,拒绝策略,线程定时执行等功能,功能更加的完善。

3.Java中如何使用线程池

3.1 JUC中的线程池 ThreadPoolExecutor
 jdk 1.5版本以后,出现了JUC(java.util.concurrent)工具包,
 工具包中提供很多支持并发编程的工具类。ThreadPoolExecutor就是其中之一,目的是解决Thread 创建线程的缺陷。
3.2 从构造方法看起

ThreadPoolExecutor 存在多个构造方法的重载,这些构造方法的重载。传入的参数都是一致的只是,个数不同而已。我们挑一个参数最长的构造方法研究。

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) 
  1. corePoolSize 核心线程数

  2. maximumPoolSize 最大线程数

  3. keepAliveTime 线程存活的时间

  4. workQueue 阻塞队列

  5. threadFactory 线程工厂

  6. handler 拒绝执行的策略
    这几个参数的作用:

    用curSize代表当前线程中的线程数量,当新的任务需要执行时,这些参数有以下的作用:
    1.curSize< corePoolSize
    直接在线程池中创建新的线程,执行任务
    2. corePoolSize<curSize<maximumPoolSize
        如果线程中的阻塞队列中线程没有装满,直接将需要执行的任务,放入阻塞的队列中。
        如果阻塞队列已经装满,直接创建新的线程执行任务。
    3. curSize>maximumPoolSize
    执行拒绝策略,即传入的handler中方法。
    

keepAliveTime 代表的是,超过核心线程数中线程如果空闲,在keepAliveTime时间之后将被销毁掉,线程池中只保留核心的线程数。

threadFactory 线程工厂可以对需要执行的线程,做相关的前置操作,如果打印线程的信息等等。

3.3 重点的api

线程池的api主要以下几个方面:

  1. 执行线程:execute(Runnable command)
  2. 关闭线程池:shutdown() 等待所有的线程执行结束关闭线程池 shutdownNow() ,立即关闭线程池。
  3. 获取线程池信息:getCorePoolSize()等
  4. 设置线程池的参数:setCorePoolSize()等

4.线程池的几种状态

  1. running 状态,可以执行需要执行的线程任务
  2. shutDown 状态 不在接受新的任务,保证阻塞队列中的任务执行完成。
  3. stop 状态 不在执行新的任务
  4. tidying状态 销毁线程,回收线程
  5. terminated 状态 完全的销毁线程池

5.Executor 创建线程池ExecutorServce

  • newFixedThreadPool(int nThreads) 最大线程数为Integer.MaxValue 存在OOM 风险
  • newCachedThreadPool() 存在oom 风险
  • newSingleThreadScheduledExecutor(ThreadFactory threadFactory) 单线程定时执行
  • newSingleThreadExecutor() 单线程执行

5.线程中出现的坑

  • 手动创建线程池,避免OOM的风险
  • 线程池使用完毕之后,记得关闭线程池。
ThreadPoolExecutor代替new Thread创建异步单线程 阿里p3c代码规范不允许使用new Thread创建线程,也不推荐使用Executors,推荐使用ThreadPoolExecutor来手动创建线程池。方式1:corePoolSize设置为0,workQueue使用SynchronousQueue 方式2:corePoolSize设置为0,但要设置allowCoreThreadTimeOut(默认值为false)为true threadPoolExecutor.allowCoreThreadTimeOut(true); workQueue使用Sync 阅读详情

相关推荐

Java并发编程中Executor框架

在Java类库中,任务执行的主要抽象不是Thread,而是Executor。 Executor源代码如下: public interface Executor { void execute(Runnable command); }它提供了一种标准的方法将任务的提交过程与执行过程解耦开来,并用Runnable来表示任务。Executor的实现还提供了对生命周期的支持以及统计信息收集、应

杨春建的博客 2702

Java线程池

什么是线程池(thread pool)?          在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是”池化资源”技术产生的原因。

豪猪的博客 430

excel wind插件使用_Python和wind的交互—在债券中的应用

个人认为学会了怎么用python和wind交互以及怎么用python处理Excel数据,就基本能替换日常很多琐碎的债券工作,还不用担心Excel某个值改变了导致整个报表都毁了。事实上在python调用wind函数和在Excel中调用函数一样简单,只要会基本的操作就够了。下面详细的介绍如何用python和wind进行交互。首先安装好python+pycharm+wind。因为python...

weixin_39863918的博客 5328

Java学习(十六)-线程与线程池学习(Thread与ThreadPoolExecutor)

一、Thread Java创建线程Thread的三种方式 1、通过继承Thread类创建线程 **单继承:**编写简单,缺点是只能继承一个类,要是想同时继承其他业务类,不能实现;要想实现多继承,只能使用implements 2、通过实现Runnable接口来创建线程 **数据共享:**Runnable是可以实现数据共享的,多个Thread可以同时加载一个runnable **线程不安全:**当各自Thread获得CPU时间片的时候开始运行Runnable,Runnable里面的资源是被共享的,所以使用

qianwenjun_19930314的博客 755

Hermes+MemOS记忆系统:用SQLite构建可编辑AI个人认知资产

AI记忆不是简单延长上下文或叠加RAG,而是构建具备分层存储、混合检索与自然语言反馈能力的个人认知资产。其核心原理在于将用户交互痕迹(L1)、偏好策略(L2)、结构化世界模型(L3)和结晶化技能统一管理,实现记忆的可追溯、可修正、可进化。技术价值体现在降低token消耗、提升长程一致性、支持离线演进,并突破传统‘静态快照’式知识库局限。典型应用场景包括个人知识助手、客服工单分析Agent、研发文档理解系统等。本文聚焦Hermes Agent与MemOS深度集成方案,详解SQLite作为ACID底座支撑L1/

weixin_33623304的博客 432

简单初识 Material Point Method(MPM)

简单初识 Material Point Method(MPM):先介绍了Lagrangian和Eulerian,并简单介绍了MPM Method

qq_45776432的博客 7365

java中Executor、ExecutorService、ThreadPoolExecutor介绍

源码非常简单,只有一个execute(Runnable command)回调接口  public interface Executor {     /**      * Executes the given command at some time in the future.  The command      * may execute in a new thread, in

linghu_java的专栏 11万+

告别GitHub!手把手教你用Gitblit在Windows 10上搭建私人局域网Git服务器(附SourceTree配置)

本文详细介绍了如何在Windows 10环境下使用Gitblit搭建私有Git服务器,实现局域网内高效代码协作。通过轻量级的Gitblit解决方案,开发者可以享受数据完全自主、离线可用性和局域网高速访问等优势。文章包含从环境准备、安装部署到SourceTree配置的全流程指南,特别适合金融、医疗等敏感行业团队使用。

weixin_30430169的博客 280

Executor的三种线程的区别

Java多线程一直是java基础中非常重要的一环,最近自己在复习时,发现对其又有了新的了解,Executor可以很方方便的管理多线程,在这把它的三种不同的线程池贴出来做一个记录,有兴趣的可以看看  Executor package chapter21.task; import java.util.concurrent.ExecutorService; import java.util.co...

成长之路 1484

【零基础入门unity游戏开发——unity通用篇30】Resources资源加载(基于unity6开发介绍)

Resources资源加载(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4114

深度强化Q学习-基于微软AirSim仿真环境的自动驾驶案例(原理代码详解简易可行)

最近在学习《强化学习原理与Python实现》,肖智清著。参考第十二章的自动驾驶案例,写一篇总结,尽量做到简单可行,让有志于自动驾驶的小伙伴可以通过此篇博客可以管中窥豹,初步了解自动驾驶的强化学习训练过程。 本篇将自动驾驶问题转化为回合制的强化学习任务,设计以车辆观察图像和运行状态为输入的自动驾驶算法,并在AirSim仿真环境中进行训练和测试。本篇使用带经验回放和目标网络的基于深度Q网络算法设计并实现智能体,对经验回放、目标网络和深度Q学习算法进行简单介绍,并用代码实现。

shao918516的博客 8599

Thread、ThreadGroup、ThreadFactory、ThreadPoolExecutor

先说Thread: 1、构造方法Thread(),调的是create()方法, private void create(ThreadGroup group, Runnable runnable, String threadName, long stackSize) { Thread currentThread = Thread.currentThread();

开发笔记 2229

BPC坏点矫正

whatis the Bad Pixel? 坏点为死点,也就是基本不随照度变化呈现光电线性转换的关系。表现为暗态常亮,亮态常暗。 坏点分类:静态坏点:亮坏点,暗坏点。 动态坏点:在一定像素范围内,该点表现正常,而超过这一范围,该点表现的比周围像素要亮。与sensor ...

camerall 1万+

QThread、Thread、ThreadPoolExecutor的线程启动

7 线程的问题 现在工程中使用的线程工具有三种,Thread 、QThread、ThreadPoolExecutor。 7.1 QThread 的线程启动 from PyQt5.QtCore import QThread class TaskTest(QThread): def __init__(self): super(TaskTest, self).__init__() self.data = None def qthread_start(sel

weixin_42376686的博客 589

自动驾驶系统研发系列—全智能驾驶新高度:深入解析车道保持辅助(ELK)功能

车道保持辅助系统(ELK)是一种基于先进视觉感知技术的主动安全系统,能够通过车载摄像头实时监测道路上的车道线、道路边缘以及周围车辆的位置。这一功能的核心在于为驾驶员提供智能化的安全辅助,尤其是在驾驶员可能因疲劳、分心或其他原因无意识地偏离车道时,系统能够主动干预,从而避免危险发生。ELK系统不仅仅依靠摄像头对道路进行感知,还结合其他传感器的数据(如雷达),实时评估自车与车道线、周边车辆的相对位置。当系统检测到车辆即将偏离车道,或越过道路边缘时,ELK会通过控制电子助力转向系统(EPS)

u013889591的专栏 1210

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Thread和ThreadPoolExecutor

Thread 原始的多线程,有两种方式拉起任务 直接在Thread中实现run方法,因为Thread本身也是Runnable public class MyThread extends Thread { @Override public void run() { System.out.println(&quot;MyThread.run()&quot;); } ...

weiwang_wang的博客 749

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Thread & ExecutorService & ThreadPoolExecutor 总览

Thread &amp;amp; ExecutorService &amp;amp; ThreadPoolExecutor 总览

Rocky的博客 1440

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Thread.interrupted()与Thread.currentThread().isInterrupted()区别

背景 今天在研究ThreadPoolExecutor源码时,在runWorker(Worker w)的方法中有一个判断条件分别用到了Thread.interrupted()和Thread.currentThread().isInterrupted() 。一之间没有看懂。就写了一个demo研究了一下,这里记录一下。 ThreadPoolExecutor.runWorker(Worker w) 的源码: 因为没有在工作中碰到,不是很明白Thread.interrupted() 和Thread.currentT

wyz0923的博客 7685

使用ThreadPoolExecutor产生的 OutOfMemoryError: unable to create new native thread 错误

转载请注明出处:http://www.codelast.com/ 最近,在使用Java的ThreadPoolExecutor来实现一个并发功能的时候,发现程序刚执行起来不久,就提示了错误: 1 OutOfMemoryError: unable to create new native thread 并且服务器立即陷入类似于“无响应”的状态,无法用Ctr...

hellozhxy的博客 1662

thread.abort java_Java ThreadPoolExecutor.AbortPolicy方法代碼示例

本文整理匯總了Java中java.util.concurrent.ThreadPoolExecutor.AbortPolicy方法的典型用法代碼示例。如果您正苦於以下問題:Java ThreadPoolExecutor.AbortPolicy方法的具體用法?Java ThreadPoolExecutor.AbortPolicy怎麽用?Java ThreadPoolExecutor.AbortPol...

weixin_28994357的博客 1224

java thread abort_ThreadPoolExecutor.AbortPolicy

ThreadPoolExecutor.AbortPolicy ClassDefinitionAssembly:Mono.Android.dllA handler for rejected tasks that throws aRejectedExecutionException.In this article[Android.Runtime.Register("java/util/concurre...

weixin_29638241的博客 382

python线程池 ThreadPoolExecutor 使用详解

从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了 ThreadPoolExecutor 和ProcessPoolExecutor两个类,实现了对threading和multiprocessing 的进一步抽象(这里主要关注线程池),不仅可以自动调度线程,还可以做到: 主线程可以获取某一个线程(或者任务的)的状态,以及返回值。 当一个...

xiaoyu_wu的博客 5万+

Java基础-Thread-线程池ThreadPoolExecutor与ExecutorService

前言 我理解的 ExecutorService只是对ThreadPoolExecutor做了一层封装,但是ThreadPoolExecutor支持更多BlockingQueue且更为灵活. 所以我一般都是使用ThreadPoolExecutor. 可以通过看源码来说明 : 以 ExecutorService cachedThreadPool = Executors.newCachedThread...

小安灬的博客 1184

java多线程ThreadPoolExecutor的使用

java多线程4种创建多线程的方式1、继承Thread类2、实现Runnable接口3、实现Callable接口4、ThreadPoolExcutor线程池1、各参数含义2、队列3、四种拒绝策略 4种创建多线程的方式 1、继承Thread类 public class MyThread extends Thread { @Override public void run() { System.out.println("继承Thread类"); } } // 调用方式 n

qq_38533495的博客 464

线程(Thread)和线程池(ThreadPoolExecutor)

1、什么是线程(Thread)和线程池(ThreadPool) 线程 线程:进程中负责程序执行的执行单元。一个进程至少有一个线程。 线程池:基本思想是对象池的思想,开辟一块内存空间,里面存放一个重操作的对象,里面存放众多的线程,池中的线程执行调度由池管理器来处理,当需要线程执行任务时,从线程池中获取一个,执行完该任务后,将线程重新放入线程池中 2、为什么需要线程池 java的线程是重量级的,如果频...

github_36537808的博客 565

ThreadPoolExecutor逻辑链梳理 - 5 Worker的Runnable属性

Thread和Worker都是Runnable的实现类,在线程池中Worker的run方法通过addWorker方法在Thread::run方法中启动,而Thread::run方法是通过Thread::start方法通过jvm启动 Worker构造时AQS的state为-1,在runWorker方法中首先解锁成为0,然后加锁成为1,在abortPolicy中输出的是即state非0的数量

weixin_44231672的博客 1400
上一篇: HashMap源码追踪
下一篇: MySQL从使用到进阶
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值