zoukankan      html  css  js  c++  java
  • CountDownLatch 使用(模拟一场比赛)

    java.util.concurrency中的CountDownLatch,主要用于等待一个或多个其他线程完成任务。CountDownLatch在初始化时,会被赋一个整数,每次执行countDown()方法,该整数都会减一,直至到0,这一过程不可逆转。其await()方法会在该整数不为0时当前线程阻塞,为0时当前线程进行下去。阻塞时,其他线程得到执行。

    下面是一个普通的案例:

    Player
    import java.util.Random;
    import java.util.concurrent.CountDownLatch;
    
    public class Player implements Runnable {
    
    	private CountDownLatch begin;
    	private CountDownLatch end;
    	private String playerNO;
    
    	public Player(String playerNO, CountDownLatch begin, CountDownLatch end) {
    		this.playerNO = playerNO;
    		this.begin = begin;
    		this.end = end;
    	}
    
    	@Override
    	public void run() {
    		// 等待枪响
    		try {
    			begin.await();
    			long timeUsed = new Random().nextInt(10000);
    			Thread.sleep(timeUsed);
    			System.out.println("运动员" + playerNO + "耗时" + timeUsed + "完成比赛");
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		} finally {
    			end.countDown();
    		}
    
    	}
    
    }
    

      

    OlympicsGame
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class OlympicsGame {
    	private static final int PLAYER_SIZE = 5;
    	private CountDownLatch begin;
    	private CountDownLatch end;
    
    	public CountDownLatch getBegin() {
    		return begin;
    	}
    
    	public void setBegin(CountDownLatch begin) {
    		this.begin = begin;
    	}
    
    	public CountDownLatch getEnd() {
    		return end;
    	}
    
    	public void setEnd(CountDownLatch end) {
    		this.end = end;
    	}
    
    	public OlympicsGame() {
    		begin = new CountDownLatch(1);
    		end = new CountDownLatch(PLAYER_SIZE);
    	}
    
    	public static void main(String[] args) {
    		// 举办一场比赛
    		OlympicsGame olympic = new OlympicsGame();
    		// 设定比赛开始,枪声
    		CountDownLatch begin = olympic.getBegin();
    		// 所有运动员结束比赛,才算结束比赛
    		CountDownLatch end = olympic.getEnd();
    		// 运动员进场,并编号,等待枪响
    		Player[] players = new Player[PLAYER_SIZE];
    		ExecutorService ex = Executors.newFixedThreadPool(PLAYER_SIZE);
    
    		for (int i = 0; i < 5; i++) {
    			players[i] = new Player("NO" + (i + 1), begin, end);
    			ex.submit(players[i]);
    		}
    		// 枪响
    		begin.countDown();
    
    		try {
    			// 等待所有运动员到达终点
    			end.await();
    			System.out.println("比赛结束,所有运动员完成比赛");
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    
    }
    

    某次执行结果是:

  • 相关阅读:
    POJ 3268 Silver Cow Party (Dijkstra)
    怒学三算法 POJ 2387 Til the Cows Come Home (Bellman_Ford || Dijkstra || SPFA)
    CF Amr and Music (贪心)
    CF Amr and Pins (数学)
    POJ 3253 Fence Repair (贪心)
    POJ 3069 Saruman's Army(贪心)
    POJ 3617 Best Cow Line (贪心)
    CF Anya and Ghosts (贪心)
    CF Fox And Names (拓扑排序)
    mysql8.0的新特性
  • 原文地址:https://www.cnblogs.com/jenkov/p/java-util-concurrency-CountDownLatch.html
Copyright © 2011-2022 走看看