news 2026/6/10 20:28:13

Java并发工具类:这些知识点你不可不知!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java并发工具类:这些知识点你不可不知!

文章目录

  • Java并发工具类:这些知识点你不可不知!
    • 一、Executor框架:线程管理的艺术
      • 1.1 线程池的基本概念
      • 1.2 线程池的类型
        • FixedThreadPool
        • CachedThreadPool
        • SingleThreadExecutor
        • ScheduledThreadPool
    • 二、CountDownLatch:让线程等待
      • 2.1 CountDownLatch的基本用法
      • 2.2 CountDownLatch的注意事项
    • 三、CyclicBarrier:循环等待的屏障
      • 3.1 CyclicBarrier的基本用法
      • 3.2 CyclicBarrier的注意事项
    • 四、Semaphore:控制并发访问
      • 4.1 Semaphore的基本用法
      • 4.2 Semaphore的注意事项
    • 总结
      • 📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

Java并发工具类:这些知识点你不可不知!

大家好,我是闫工,今天咱们来聊一聊Java中的并发工具类。作为一名Java工程师,如果你对并发编程还不是很熟悉的话,那这篇文章可能会让你眼前一亮!并发工具类是Java中非常重要的知识点,掌握它们不仅能让你在面试中脱颖而出,还能在实际开发中写出高效、优雅的代码。

那么,什么是并发工具类呢?简单来说,就是Java提供的一些帮助我们处理多线程并发问题的类。这些类分布在java.util.concurrent包下,包含了诸如线程池、锁、同步器等等工具。今天咱们就来逐一了解一下这些工具类,看看它们各自有什么特点和应用场景。


一、Executor框架:线程管理的艺术

1.1 线程池的基本概念

在Java中,Executor框架是并发编程的核心,它简化了线程的管理和使用。传统的线程创建方式是通过new Thread()来启动一个线程,但这种方式存在一些问题:

  • 资源浪费:每次创建线程都需要消耗一定的系统资源。
  • 难以管理:当线程数量很多时,很难统一管理和控制它们。

Executor框架则很好地解决了这些问题。它采用“线程池”的概念,允许我们将任务提交到一个线程池中,由线程池来管理和复用线程,从而提高程序的性能和资源利用率。

1.2 线程池的类型

Java中的线程池主要有以下几种实现:

  • FixedThreadPool:固定大小的线程池。
  • CachedThreadPool:可缓存的线程池,适用于执行短期任务。
  • SingleThreadExecutor:单线程的线程池,保证所有任务串行执行。
  • ScheduledThreadPool:支持延迟和周期性任务的线程池。
FixedThreadPool

FixedThreadPool是最常见的线程池类型之一。它会维护一个固定大小的线程池,当提交的任务数量超过线程池容量时,剩下的任务会被放入队列中等待执行。

ExecutorServiceexecutor=Executors.newFixedThreadPool(5);for(inti=0;i<10;i++){executor.submit(()->System.out.println("Task executed by "+Thread.currentThread().getName()));}executor.shutdown();

特点:

  • 线程池大小固定。
  • 适用于任务数量较多且需要控制资源消耗的场景。
CachedThreadPool

CachedThreadPool是一个动态扩展的线程池。当提交的任务数量超过当前线程数时,它会创建新的线程来执行这些任务;而当线程空闲一段时间后,它们会被回收。

ExecutorServiceexecutor=Executors.newCachedThreadPool();for(inti=0;i<10;i++){executor.submit(()->System.out.println("Task executed by "+Thread.currentThread().getName()));}executor.shutdown();

特点:

  • 线程池大小动态调整。
  • 适用于短期、临时的任务。
SingleThreadExecutor

SingleThreadExecutor是一个单线程的线程池,所有任务都会串行执行。虽然看起来效率不高,但在某些场景下非常有用。

ExecutorServiceexecutor=Executors.newSingleThreadExecutor();for(inti=0;i<5;i++){executor.submit(()->System.out.println("Task "+i+" executed by "+Thread.currentThread().getName()));}executor.shutdown();

特点:

  • 所有任务串行执行。
  • 适用于需要保证顺序执行的场景。
ScheduledThreadPool

ScheduledThreadPool支持延迟和周期性任务的执行。它结合了固定大小线程池的功能,并提供了schedule()方法来安排任务。

ScheduledExecutorServiceexecutor=Executors.newScheduledThreadPool(3);// 延迟1秒后执行executor.schedule(()->System.out.println("Delayed task executed"),1,TimeUnit.SECONDS);// 每隔2秒执行一次,第一次延迟5秒executor.scheduleAtFixedRate(()->System.out.println("Periodic task executed"),5,2,TimeUnit.SECONDS);

特点:

  • 支持延迟和周期性任务。
  • 线程池大小固定。

二、CountDownLatch:让线程等待

在并发编程中,我们常常需要让一个或多个线程等待某些条件满足后才能继续执行。CountDownLatch就是一个非常有用的工具类,它允许我们在指定的“门”关闭之前阻塞线程。

2.1 CountDownLatch的基本用法

CountDownLatch通过计数器来实现同步。初始化时需要指定一个计数值,每次调用countDown()方法会将计数值减1,当计数值为0时,“门”才会打开,被阻塞的线程才能继续执行。

importjava.util.concurrent.CountDownLatch;publicclassCountDownLatchExample{publicstaticvoidmain(String[]args)throwsInterruptedException{CountDownLatchlatch=newCountDownLatch(3);// 启动三个子线程,分别完成任务后调用countDown()for(inti=0;i<3;i++){newThread(()->{System.out.println("Task completed by "+Thread.currentThread().getName());latch.countDown();}).start();}// 主线程等待latch完成latch.await();System.out.println("All tasks are done!");}}

运行结果:

Task completed by Thread-0 Task completed by Thread-1 Task completed by Thread-2 All tasks are done!

2.2 CountDownLatch的注意事项

  • 不可重用:一旦计数值减为0,CountDownLatch就不能再使用了。
  • 线程安全:多个线程同时调用countDown()方法是线程安全的。

三、CyclicBarrier:循环等待的屏障

如果说CountDownLatch是一个“门”,那么CyclicBarrier就是一个可以重复使用的“门”。它允许多个线程在某个指定的点上互相等待,直到所有线程都到达该点后才继续执行。

3.1 CyclicBarrier的基本用法

CyclicBarrier通过一个同步点来协调多个线程。初始化时需要指定参与同步的线程数量,并且可以通过重置方法reset()重新使用它。

importjava.util.concurrent.CyclicBarrier;publicclassCyclicBarrierExample{publicstaticvoidmain(String[]args)throwsInterruptedException{CyclicBarrierbarrier=newCyclicBarrier(3,()->System.out.println("All threads are at the barrier!"));for(inti=0;i<3;i++){newThread(()->{System.out.println(Thread.currentThread().getName()+" is waiting at the barrier.");try{barrier.await();}catch(InterruptedExceptione){Thread.currentThread().interrupt();}System.out.println(Thread.currentThread().getName()+" continues execution.");}).start();}}}

运行结果:

Thread-0 is waiting at the barrier. Thread-1 is waiting at the barrier. Thread-2 is waiting at the barrier. All threads are at the barrier! Thread-0 continues execution. Thread-1 continues execution. Thread-2 continues execution.

3.2 CyclicBarrier的注意事项

  • 可重用CyclicBarrier可以通过调用reset()方法重新使用。
  • 线程安全:多个线程同时调用await()方法是线程安全的。

四、Semaphore:控制并发访问

在某些场景下,我们可能需要限制同时访问某个资源的线程数量。Semaphore就是用来实现这种功能的工具类。

4.1 Semaphore的基本用法

Semaphore通过许可来控制并发访问。初始化时可以指定许可证的数量,并且可以通过acquire()release()方法来获取和释放许可证。

importjava.util.concurrent.Semaphore;publicclassSemaphoreExample{publicstaticvoidmain(String[]args)throwsInterruptedException{// 最多允许3个线程同时访问资源Semaphoresemaphore=newSemaphore(3);for(inti=0;i<5;i++){newThread(()->{try{// 尝试获取许可证,如果无可用许可证则阻塞semaphore.acquire();System.out.println(Thread.currentThread().getName()+" is accessing the resource.");Thread.sleep(1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}finally{// 释放许可证semaphore.release();}}).start();}}}

运行结果:

Thread-0 is accessing the resource. Thread-1 is accessing the resource. Thread-2 is accessing the resource. ...

4.2 Semaphore的注意事项

  • 公平性:默认情况下,Semaphore是非公平的,可能会导致某些线程长时间被阻塞。
  • 可重用:许可证可以被多次获取和释放。

总结

在Java并发编程中,CountDownLatchCyclicBarrierSemaphore是非常有用的工具类。它们可以帮助我们更好地控制线程的同步与协作。

  • CountDownLatch适用于需要等待多个任务完成后再继续执行的场景。
  • CyclicBarrier适用于需要让多个线程在某个点上互相等待的场景,而且可以重复使用。
  • Semaphore适用于需要限制同时访问某资源的线程数量的场景。

📚 领取 | 1000+ 套高质量面试题大合集(无套路,闫工带你飞一把)!

成体系的面试题,无论你是大佬还是小白,都需要一套JAVA体系的面试题,我已经上岸了!你也想上岸吗?

闫工精心准备了程序准备面试?想系统提升技术实力?闫工精心整理了1000+ 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 + 详细解析,并附赠高频考点总结、简历模板、面经合集等实用资料!

✅ 覆盖大厂高频题型
✅ 按知识点分类,查漏补缺超方便
✅ 持续更新,助你拿下心仪 Offer!

📥免费领取👉 点击这里获取资料

已帮助数千位开发者成功上岸,下一个就是你!✨

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:38:55

Java多线程面试必问:CyclicBarrier与CountDownLatch有何不同?

文章目录Java多线程面试必问&#xff1a;CyclicBarrier与CountDownLatch有何不同&#xff1f;什么是CyclicBarrier&#xff1f;CyclicBarrier的核心方法使用场景示例代码什么是CountDownLatch&#xff1f;CountDownLatch的核心方法使用场景示例代码CyclicBarrier与CountDownLat…

作者头像 李华
网站建设 2026/6/10 13:12:03

开发者必备:腾讯混元OCR API接口开发接入指南

开发者必备&#xff1a;腾讯混元OCR API接口开发接入指南 在文档数字化浪潮席卷各行各业的今天&#xff0c;一个现实问题始终困扰着开发者&#xff1a;如何用最低的成本、最快的速度&#xff0c;把一张张杂乱的纸质票据、身份证件或扫描讲义&#xff0c;变成可搜索、可分析的结…

作者头像 李华
网站建设 2026/6/9 20:05:09

网盘直链下载助手搭配使用:快速获取HunyuanOCR模型包

网盘直链下载助手搭配使用&#xff1a;快速获取HunyuanOCR模型包 在AI落地越来越依赖“开箱即用”的今天&#xff0c;一个看似不起眼的环节——如何把动辄几个GB的大模型从网盘里高效、稳定地拉下来——往往成了开发者真正跑通第一个推理任务前的最大拦路虎。尤其是在国内生态中…

作者头像 李华
网站建设 2026/6/10 0:25:45

国际植物园联盟:HunyuanOCR数字化古老植物标本标签

国际植物园联盟&#xff1a;HunyuanOCR数字化古老植物标本标签 在欧洲某历史悠久的植物园档案室里&#xff0c;一位研究员正小心翼翼地翻开一本19世纪的标本集。泛黄的纸页上贴着干枯的植物样本&#xff0c;旁边是用法文和拉丁文书写的标签——字迹因年代久远而模糊不清&#x…

作者头像 李华
网站建设 2026/6/10 11:34:49

联合国文件处理:HunyuanOCR支持六种官方语言互译识别

HunyuanOCR&#xff1a;让联合国六种官方语言文档处理进入“秒级翻译”时代 在日内瓦的某个清晨&#xff0c;一份由阿拉伯语起草的安理会决议草案被扫描上传至系统。不到两分钟&#xff0c;它已转化为结构化英文文本&#xff0c;关键字段自动提取、多语言版本同步生成&#xff…

作者头像 李华
网站建设 2026/6/10 11:36:45

腾讯混元OCR文字识别技术全面解析:轻松实现多语言文档处理

腾讯混元OCR文字识别技术全面解析&#xff1a;轻松实现多语言文档处理 在企业数字化转型加速的今天&#xff0c;一份跨国合同、一张海外发票、一段视频字幕&#xff0c;都可能成为信息流转的“卡点”。如何让机器真正“读懂”这些复杂多样的视觉文本&#xff1f;传统OCR系统早已…

作者头像 李华