news 2026/5/15 19:21:25

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/5/1 14:16:50

vue+uniapp+springboot微信小程序的校园外卖系统 商家_of8f5

文章目录 系统概述技术架构商家端核心功能特色与优化 主要技术与实现手段系统设计与实现的思路系统设计方法java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 该系统基于Vue.js、UniApp和Spring Boot技…

作者头像 李华
网站建设 2026/5/7 3:14:22

国际标准跟踪:HunyuanOCR提取IEC/ISO等组织发布的新规范

国际标准跟踪&#xff1a;HunyuanOCR如何高效提取IEC/ISO等组织发布的新规范 在智能制造、工业自动化和全球合规日益紧密交织的今天&#xff0c;企业对国际技术标准的响应速度直接决定了产品能否顺利出海、系统是否符合安全要求。IEC&#xff08;国际电工委员会&#xff09;、I…

作者头像 李华
网站建设 2026/5/14 23:45:33

国际奥委会:HunyuanOCR识别运动员资格证明文件

国际奥委会采用HunyuanOCR实现运动员资格文件智能识别 在东京奥运会期间&#xff0c;国际奥委会曾因数千份纸质报名材料的审核积压而面临巨大压力。来自195个国家和地区的代表团提交的资格证明格式各异、语言混杂——一份俄罗斯田径运动员的档案可能包含西里尔字母的成绩单、英…

作者头像 李华
网站建设 2026/5/1 2:43:06

留学中介材料准备:HunyuanOCR识别成绩单转换为英文译文

HunyuanOCR&#xff1a;让留学成绩单翻译从30分钟缩短到2分钟 在一家中型留学中介机构的办公室里&#xff0c;顾问小李正对着电脑皱眉。屏幕上是一张模糊的扫描件——某重点高中的成绩单&#xff0c;表格错位、文字倾斜&#xff0c;还有手写的“总评”和“等级”。她需要手动录…

作者头像 李华
网站建设 2026/5/8 7:18:38

全球地质调查合作:HunyuanOCR识别各国矿产勘查手绘图注释

HunyuanOCR赋能全球地质调查&#xff1a;破解多语种手绘矿产图的数字化难题 在乌兹别克斯坦某档案馆的地下室里&#xff0c;一叠泛黄的手绘图纸静静躺在铁皮柜中——那是1978年苏联地质队对天山南麓金矿带的勘查记录。图上密布着俄文标注的品位数据、中文批注的“远景良好”&am…

作者头像 李华
网站建设 2026/5/8 8:34:54

【.NET性能优化秘籍】:集合表达式合并操作的3种高阶用法

第一章&#xff1a;集合表达式合并操作的核心概念在现代编程语言和数据处理框架中&#xff0c;集合表达式的合并操作是构建复杂查询逻辑的基础。这类操作允许开发者将多个集合&#xff08;如数组、列表或数据库结果集&#xff09;按照特定规则进行组合&#xff0c;从而生成新的…

作者头像 李华