java 并发包 CountDownLatch 例子

/**CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行CountDownLatch如其所写,是一个倒计数的锁存器,当计数减至0时触发特定的事件。利用这种特性,可以让主线程等待子线程的结束。下面以一个模拟运动员比赛的例子加以说明。*/  import java.util.concurrent.CountDownLatch;
  import java.util.concurrent.Executor;
  import java.util.concurrent.ExecutorService;
  import java.util.concurrent.Executors;
 
  public class CountDownLatchDemo {
     private static final int PLAYER_AMOUNT = 5;
     public CountDownLatchDemo() {
         // TODO Auto-generated constructor stub    
      }
     /**
      * @param args
      */
     public static void main(String[] args) {
         // TODO Auto-generated method stub
         //对于每位运动员,CountDownLatch减1后即结束比赛
         CountDownLatch begin = new CountDownLatch(1);
         //对于整个比赛,所有运动员结束后才算结束
         CountDownLatch end = new CountDownLatch(PLAYER_AMOUNT);
         Player[] plays = new Player[PLAYER_AMOUNT];
         
         for(int i=0;i<PLAYER_AMOUNT;i++)
             plays[i] = new Player(i+1,begin,end);
         
         //设置特定的线程池,大小为5
         ExecutorService exe = Executors.newFixedThreadPool(PLAYER_AMOUNT);
         for(Player p:plays)
             exe.execute(p);            //分配线程
         System.out.println("Race begins!");
         begin.countDown();
         try{
             end.await();            //等待end状态变为0,即为比赛结束
         }catch (InterruptedException e) {
             // TODO: handle exception
             e.printStackTrace();
         }finally{
             System.out.println("Race ends!");
         }
         exe.shutdown();
     }
 }


 

Java并发包`java.util.concurrent`(简称JUC)是Java中用于支持并发编程的核心工具包之一,它提供了丰富的类和接口来简化多线程程序的开发,并提升程序在高并发环境下的性能与可靠性。以下是一些使用指南和常用类的介绍。 ### 线程池管理 线程池是一种管理多个线程执行任务的机制,它可以有效地控制运行中的线程数量并复用已有的线程,从而减少创建和销毁线程带来的开销。`ThreadPoolExecutor` 是 JUC 包中一个灵活且功能强大的线程池实现,允许开发者自定义核心线程数、最大线程数、空闲线程存活时间等参数[^2]。 ```java // 创建一个固定大小的线程池 ExecutorService executor = Executors.newFixedThreadPool(5); ``` ### 并发容器 为了应对多线程环境下数据结构的安全访问问题,JUC 提供了几种高效的并发容器。例如: - `CopyOnWriteArrayList` 和 `CopyOnWriteArraySet` 适用于读多写少的情况,在修改时会复制整个底层数组以保证迭代时抛出异常。 - `ConcurrentHashMap` 是 HashMap 的线程安全版本,它通过分段锁技术提高了并发访问时的性能,相比传统的 Hashtable 更加高效。 - `ConcurrentSkipListMap` 提供了基于跳表实现的有序映射,支持并发访问的同时保持键值对按照自然顺序或者指定比较器排序[^2]。 ### 同步辅助类 这些类可以帮助协调多个线程之间的操作,常见的有: - **CountDownLatch**:使一个或一组线程等待其他线程完成一系列操作后才继续执行。 - **Semaphore**:用来控制同时访问的数量,常用于资源池如数据库连接池。 - **CyclicBarrier**:类似于 CountDownLatch,但它可以被重复使用,当所有参与方都到达屏障点时触发动作。 - **Exchanger**:允许两个线程交换信息,在某些特定场景下非常有用[^2]。 ### 原子变量 Java并发包还提供了一系列原子类,位于 `java.util.concurrent.atomic` 包下,它们利用CAS(Compare And Swap)算法实现了无锁化的设计,这使得即使在高度竞争的情况下也能保持较好的性能。典型的例子包括 `AtomicInteger`, `AtomicLong` 等,适用于需要频繁更新但又想引入重量级锁的情形[^3]。 ### 日志记录 对于调试以及监控应用程序的行为来说,日志记录是非常重要的部分。推荐使用 SLF4J 作为日志门面,配合具体的日志实现框架比如 Logback 或者 Log4j 来进行详细的日志输出配置。下面展示了一个简单的日志例: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Example { private static final Logger logger = LoggerFactory.getLogger(Example.class); public void doSomething() { try { // 执行一些可能抛出异常的操作 } catch (Exception e) { logger.error("发生错误", e); } } } ``` 以上只是对 Java 并发包的一些基础内容进行了概述,际应用中还有很多高级特性和最佳践值得探索。希望这些信息能够帮助您更好地理解和运用 Java 中的并发编程技巧。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值