news 2026/3/2 9:47:53

Java进阶13 线程池

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java进阶13 线程池

Java进阶13 线程池

一、线程生命周期

线程被创建并启动以后,它并不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象在不同的时期有不同的状态,这各种状态就是线程的生命周期。

Java中的线程状态被定义在了java.lang.Thread.State枚举类

状态

含义

NEW(新建)

创建线程对象

RUNNABLE(就绪)

start方法被调用,但是还没有抢到CPU执行权

BLOCKED(阻塞)

线程开始运行,但是没有获取到锁对象

WAITING(等待)

wait方法

TIMED-WAITING(计时等待)

sleep方法

TERMINATED(结束状态)

代码全部运行完毕

1、线程生命周期图

过程:创建(NEW)线程后调用start方法进入就绪(RUNNABLE)状态,如果该线程顺利抢到CPU执行权,就进入运行状态,运行主要执行run方法中的代码逻辑,如果运行期间没有被其他线程夺走CPU执行权,则该线程将一直运行至结束,结束后进入**死亡(TERMINTATED)状态。但如果运行期间被其他线程抢走CPU执行权,该线程将回到就绪状态。此外,当其运行期间调用了sleep()方法,则会进入即计时等待(TIMED-WAITING)状态 ,指定的休眠时间到达后,自动转为就绪状态;如果调用了wait()方法,就会进入无限等待(WAITING)状态,需要其他线程调用notify()方法才能继续进入就绪状态;如果在运行期间无法获取到锁,就会进入阻塞(BLOCKED)**状态,知道其他线程释放了锁,该线程才能获得锁,获得锁之后就会进入就绪状态。

二、线程池

将线程对象交给线程池维护,可以降低系统成本,从而提升程序的性能

2、使用JDK提供的线程池

方法

说明

static ExecutorService newCachedThreadPool()

创建一个默认的线程池

static newFixedThreadPool(int nThreads)

创建一个指定最多线程数量的线程池

3、自定义线程池

ThreadPoolExecutor类

3.1 构造方法
ThreadPoolExecutor(int corePoolSize,int maxnumPoolSize,long keepActiveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
  • 参数1:核心线程数量【不能小于0】

  • 参数2:最大线程数量(核心线程数+临时线程数)【不能小于等于0】

  • 参数3:空闲时间(数值)【不能小于0】

  • 参数4:时间单位【时间单位】

  • 参数5:任务队列【不能为null】

    • 有限队列 new ArrayBlockingQueue<>(队列长度)

    • 无限队列 new LinkedBlockingQueue<>()

  • 参数6:线程对象任务工厂【不能为null】

  • 参数7:拒绝策略【不能为null】

3.2 Demo
public class ThreadPoolDemo2 { ? ?public static void main(String[] args) { ? ? ? ?/* ? ? ? ? ? ?指定核心线程数为2,最大线程数为5,空闲时间为60秒,有限队列,线程任务工厂为指定默认的工厂,拒绝策略为AbortPolicy的自定义线程池; ? ? ? ?*/ ? ? ? ?ThreadPoolExecutor pool = new ThreadPoolExecutor( ? ? ? ? ? ? ? ?2, ? ? ? ? ? ? ? ?5, ? ? ? ? ? ? ? ?60, ? ? ? ? ? ? ? ?TimeUnit.SECONDS, ? ? ? ? ? ? ? ?new ArrayBlockingQueue<>(10), ? ? ? ? ? ? ? ?Executors.defaultThreadFactory(), ? ? ? ? ? ? ? ?new ThreadPoolExecutor.AbortPolicy() ? ? ? ); ? ? ? ? ?for (int i = 1; i <= 16; i++) { ? ? ? ? ? ?pool.submit(new Runnable() { ? ? ? ? ? ? ? ?@Override ? ? ? ? ? ? ? ?public void run() { ? ? ? ? ? ? ? ? ? ?System.out.println(Thread.currentThread().getName()+"提交了线程任务"); ? ? ? ? ? ? ? } ? ? ? ? ? }); ? ? ? } ? } }
3.3 注意事项
  • Q:临时线程对象何时创建?

    A:提交的线程任务数量 >核心线程数 + 任务队列数量

  • Q:什么时候会触发拒绝策略?

    A:提交的线程任务数量 >最大线程数 + 任务队列数量

3.4 拒绝策略

策略选项

说明

ThreadPoolExecutor.AbortPolicy

丢弃任务并抛出RejectedExecutionException异常(默认)

ThreadPoolExecutor.DiscardPolicy

丢弃任务,但是不抛出异常,这是不推荐的做法

ThreadPoolExecutor.DiscardOldestPolicy

抛弃队列中等待最久的任务,然后把当前任务加入队列中

ThreadPoolExecutor.CallerRunPolicy

调用任务的run()方法,绕过线程池直接执行

三、单例设计模式

单例指单个实例,保证类的对象在内存中只有一份

1、使用场景

如果创建一个对象需要消耗的资源过多,比如I/O与数据库的连接,并且这个对象完全是可以复用的,我们就可以考虑将其设计为单例的对象

2、设计模式
2.1 饿汉式
class Single { ? ? ? ? //1、私有构造方法,组织其他类创建本类对象 ? ?private Single(){ ? } ? ? ?//在本类中创建自己这个类的对象 ? ?private static Single s = new Single(); ? ? ? ?/** ? ? * 提供一个方法供外部获取本类单例对象 ? ? * @return 返回单例对象 ? ? */ ? ?public static Single getInstance(){ ? ? ? ?return s; ? } }
2.2 懒汉式(延迟加载模式)
class Single { ? ? ? ? //1、私有构造方法,组织其他类创建本类对象 ? ?private Single(){ ? } ? ? ?//在本类中创建自己这个类的对象 ? ?private static Single s = new Single(); ? ? ? ?/** ? ? * 提供一个方法供外部获取本类单例对象 ? ? * @return 返回单例对象 ? ? */ ? ?public static Single getInstance(){ ? ? ? ?return s; ? } }
  • 注意事项:双重检查锁是可以减少上锁次数,避免创建出多个对象造成效率浪费
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/1 8:28:10

CSDN(中国软件开发网)作为中国领先的IT技术交流平台,每年都会基于社区活跃度、开发者关注热点

CSDN&#xff08;中国软件开发网&#xff09;作为中国领先的IT技术交流平台&#xff0c;每年都会基于社区活跃度、开发者关注热点、技术文章发布趋势、开源项目动态以及行业应用进展等多维度数据&#xff0c;发布年度技术趋势预测。以下是根据近年来的技术发展和CSDN社区动态总…

作者头像 李华
网站建设 2026/3/1 12:17:18

深度学习毕设项目推荐-深度学习基于python的CNN训练识别吃的美食基于python的深度学习CNN训练识别吃的美食

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/28 4:15:04

Java 进阶:如何让线程主动让出 CPU

Java 进阶如何让线程主动让出 CPU ThreadsleepThreadyieldThreadcurrentThreadsuspendObjectwaitLockSupportparkThreadstop Java 进阶&#xff1a;如何让线程主动让出 CPU Thread.sleep sleep 方法可以让线程主动让出 CPU&#xff0c;但是并不会释放锁。 /*** Causes the …

作者头像 李华
网站建设 2026/2/27 23:38:48

HDFS的架构优势与基本操作

目录 写在前面一、 HDFS概述 1.1 HDFS简介1.2 HDFS优缺点 1.2.1 优点1.2.2 缺点 1.3 HDFS组成架构1.4 HDFS文件块大小 二、HDFS的Shell操作&#xff08;开发重点&#xff09; 2.1 基本语法2.2 命令大全2.3 常用命令实操 2.3.1 上传2.3.2 下载2.3.3 HDFS直接操作 三、HDFS的AP…

作者头像 李华
网站建设 2026/2/28 14:10:49

通信协议仿真:蓝牙协议仿真_(8).蓝牙仿真硬件平台

蓝牙仿真硬件平台 在进行蓝牙协议仿真时&#xff0c;选择合适的硬件平台是至关重要的。蓝牙仿真硬件平台不仅需要支持蓝牙协议的基本功能&#xff0c;还需要具备灵活性和可扩展性&#xff0c;以便进行各种复杂场景的仿真和测试。本节将详细介绍蓝牙仿真硬件平台的选择、配置和使…

作者头像 李华
网站建设 2026/2/28 2:16:10

基于 VSC 的 UPFC(统一潮流控制器)研究(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

作者头像 李华