利用CountDownLatch实现的一个简单的线程同步场景

简介: 利用CountDownLatch实现的一个简单的线程同步场景
package countdownlatchTest;
import java.util.concurrent.CountDownLatch;
class Worker {    
  private String name;        // 名字    
  private long workDuration;  // 工作持续时间      
  public Worker(String name, long workDuration) {        
    this.name = name;        
    this.workDuration = workDuration;    
    System.out.println("Worker: " + name + " is assigned with work time: " + workDuration);
  }      
  public void doWork() {        
    System.out.println(name + " begins to work...");        
    try {            
      Thread.sleep(workDuration); // 用休眠模拟工作执行的时间        
    } catch(InterruptedException ex) {
      ex.printStackTrace();        
    }
    System.out.println(name + " has finished the job...");    
  } 
}
class WorkerTestThread implements Runnable {    
  private Worker worker;    
  private CountDownLatch cdLatch;      
  public WorkerTestThread(Worker worker, CountDownLatch cdLatch) {        
    this.worker = worker;        
    this.cdLatch = cdLatch;    
  }      
  @Override    
  public void run() {        
    worker.doWork();        // 让工人开始工作        
    cdLatch.countDown();    // 工作完成后倒计时次数减1    
  } 
}
public class CountDownLatchTest {
  private static final int MAX_WORK_DURATION = 5000;  // 最大工作时间    
  private static final int MIN_WORK_DURATION = 1000;  // 最小工作时间      
  // 产生随机的工作时间    
  private static long getRandomWorkDuration(long min, long max) {        
    return (long) (Math.random() * (max - min) + min);    
  }      
  public static void main(String[] args) {    
    /* 2是次数,不是时间数
     * 将这个CountDownLatch引用赋给工作线程,每次工作线程完成任务后,调用
     * CountDownLatch.countDown, 将计数器减一。如果技术器减到0,阻塞的await方法
     * 才会返回,重新获得控制权
     */
    CountDownLatch latch = new CountDownLatch(2);  // should be exactly 2
    Worker w1 = new Worker("Jerry Worker 1", getRandomWorkDuration(MIN_WORK_DURATION, MAX_WORK_DURATION));  
    Worker w2 = new Worker("Jerry Worker 2", getRandomWorkDuration(MIN_WORK_DURATION, MAX_WORK_DURATION));  
    new Thread(new WorkerTestThread(w1, latch)).start();        
    new Thread(new WorkerTestThread(w2, latch)).start();          
    // latch.countDown();
    try {          
      // 仅当CountDownLatch的count降低到0时,这个阻塞的方法才会返回
      latch.await(); 
      System.out.println("All jobs have been finished!");        
    } 
    catch (InterruptedException e) {            
      e.printStackTrace();
    }
  }
}


相关文章
|
5月前
|
Java 测试技术
CountDownLatch、CyclicBarrier让线程听我号令
CountDownLatch、CyclicBarrier让线程听我号令
61 0
|
3月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
38 0
|
3月前
|
消息中间件 安全 Java
线程和进程的区别及应用场景
线程和进程的区别及应用场景
|
3月前
|
消息中间件 安全 Java
线程和进程的区别及应用场景
线程和进程的区别及应用场景
|
3月前
|
存储 安全 Java
多线程线程安全问题之ThreadLocal是什么,它通常用于什么场景
多线程线程安全问题之ThreadLocal是什么,它通常用于什么场景
|
4月前
|
Java
Runnable+CountDownLatch多线程的等待和通知
Runnable+CountDownLatch多线程的等待和通知
|
3月前
|
安全 算法 Java
Java面试题:如何诊断和解决Java应用程序中的内存泄漏问题?如何实现一个线程安全的计数器?如何合理配置线程池以应对不同的业务场景?
Java面试题:如何诊断和解决Java应用程序中的内存泄漏问题?如何实现一个线程安全的计数器?如何合理配置线程池以应对不同的业务场景?
23 0
|
3月前
|
Java 开发者
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
22 0
|
4月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
28 1
|
5月前
|
安全 Java API
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
多线程(JUC, ReentrantLock, 原子类, 线程池, 信号量 Semaphore, CountDownLatch)
48 4