我们可以通过闭锁(CountDownLatch)来同时启动一组相关线程,或等待一组相关线程的结束。可是闭锁是一次性对象,一旦进入终止状态,就不能被重置。栅栏类似于闭锁,它能够阻塞一组线程直到某个事件发生。CyclicBarrier可以使一定数量的参与线程反复地在栅栏处汇集。如果希望创建一组任务,并行地执行工作,然后在下一步开始前等待;知道直到所有工作结束。这个就可以使用栅栏(CyclicBarrier)
CyclicBarrier在并行迭代算法中是非常有用的:这种算法将一个问题拆分为一系列相对独立的子问题。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有线程被被释放,而栅栏被重置以便下次使用。如果对await调用超时或者await阻塞线程被中断,那么栅栏就被认为是打破了,所有阻塞的await调用都将抛出一个BrokenBarrierException.
public class CyclicBarrier { private static class Generation { boolean broken = false; } /** 栅栏入口的锁 */ private final ReentrantLock lock = new ReentrantLock(); /** 一直等待到跳闸的条件 */ private final Condition trip = lock.newCondition(); /** 缔约方数量 */ private final int parties; /*跳闸时执行的命令 */ private final Runnable barrierCommand; private Generation generation = new Generation(); /** * 尚未等待的缔约方数量 */ private int count; /** * 获取下一代 */ private void nextGeneration() { trip.signalAll(); count = parties; generation = new Generation(); } /** * 设置当前栅栏代被打破,唤醒所有等待线程 */ private void breakBarrier() { generation.broken = true; count = parties; trip.signalAll(); } /** * Main barrier code, covering the various policies. */ private int dowait(boolean timed, long nanos) throws InterruptedException, BrokenBarrierException, TimeoutException { //重入锁 final ReentrantLock lock = this.lock; // 锁 lock.lock(); try { final Generation g = generation; // 如果当前一代栅栏已经跳闸则抛出异常 if (g.broken) throw new BrokenBarrierException(); // 如果线程中断则打开栅栏 if (Thread.interrupted()) { breakBarrier(); throw new InterruptedException(); } // 等待线程自减 int index = --count; // 如果当前线程已经是最后一个线程,则执行回调同时代开栅栏 if (index == 0) { // tripped boolean ranAction = false; try { final Runnable command = barrierCommand; if (command != null) command.run(); ranAction = true; nextGeneration(); return 0; } finally { if (!ranAction) breakBarrier(); } } // 一直循环直到栅栏跳闸,打开,中断或超时 for (;;) { try { if (!timed) trip.await(); else if (nanos > 0L) nanos = trip.awaitNanos(nanos); } catch (InterruptedException ie) { if (g == generation && ! g.broken) { breakBarrier(); throw ie; } else { Thread.currentThread().interrupt(); } } if (g.broken) throw new BrokenBarrierException(); if (g != generation) return index; if (timed && nanos <= 0L) { breakBarrier(); throw new TimeoutException(); } } } finally { lock.unlock(); } } /** * 创建一个新的CyclicBarrier,他会在指定数量的线程都在等待是跳闸,最后一个线程通过栅栏后执行栅栏回调处理 */ public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new IllegalArgumentException(); // 缔约方数量是指定的线程数 this.parties = parties; //等待线程数 this.count = parties; //栅栏命令 this.barrierCommand = barrierAction; } /** */ public CyclicBarrier(int parties) { this(parties, null); } /** * 获取缔约方数量 */ public int getParties() { return parties; } /** * 一直阻塞到所有的缔约方都调用这个方法 */ public int await() throws InterruptedException, BrokenBarrierException { try { return dowait(false, 0L); } catch (TimeoutException toe) { throw new Error(toe); // cannot happen } } public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException { return dowait(true, unit.toNanos(timeout)); } /** * 查询当前栅栏是否被打破 */ public boolean isBroken() { final ReentrantLock lock = this.lock; lock.lock(); try { return generation.broken; } finally { lock.unlock(); } } /** * 重置栅栏 */ public void reset() { final ReentrantLock lock = this.lock; lock.lock(); try { breakBarrier(); // break the current generation nextGeneration(); // start a new generation } finally { lock.unlock(); } } /** * 获取等待的线程数量 */ public int getNumberWaiting() { final ReentrantLock lock = this.lock; lock.lock(); try { return parties - count; } finally { lock.unlock(); } } }
加入我们有一个汽车竞速赛事,同时启动最先到达终点的汽车胜出。赛事里程是固定的,我们可以将时间分割成很小的一段,每辆汽车在这一段时间行驶的里程是不同的。
/** * * @author zhangwei_david * @version $Id: Horser.java, v 0.1 2015年7月3日 下午3:15:40 zhangwei_david Exp $ */ public class Car implements Runnable { /** * 汽车ID */ private final String id; /** * 门闸 */ private static CyclicBarrier cyclicBarrier; /** * 里程 */ private AtomicInteger strides = new AtomicInteger(0); private static Random rand = new Random(47); public Car(CyclicBarrier barrier, String id) { cyclicBarrier = barrier; this.id = id; } public int getStrides() { return strides.get(); } /** * @see java.lang.Runnable#run() */ public void run() { try { while (!Thread.interrupted()) { synchronized (this) { strides.set(strides.get() + rand.nextInt(3)); } // 准备了可以开始,当门闸所有的线程都已经调用了await方法则可以继续执行 cyclicBarrier.await(); } } catch (InterruptedException e) { } catch (BrokenBarrierException be) { throw new RuntimeException(be); } } /** * @see java.lang.Object#toString() */ @Override public String toString() { return " [car " + id + "]"; } public String tracks() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < getStrides(); i++) { sb.append("-"); } sb.append(id); return sb.toString(); } }
/** * 汽车拉力赛的类 * * @author zhangwei_david * @version $Id: HorseRace.java, v 0.1 2015年7月3日 下午10:27:44 zhangwei_david Exp $ */ public class CarRace { /** * 指定赛道长度 */ private static final int FINISH_LINE = 75; /** * 赛道标尺线 */ public static final String TRACK = "==========================================================================="; /** * 参赛汽车 */ private List<Car> cars = new ArrayList<Car>(); private ExecutorService service = Executors.newCachedThreadPool(); /** * 门闸 */ private CyclicBarrier barrier; public CarRace(int nCars) { /** * 创建一个执行线程数量的CyclicBarrier,当所有现在都准备好以后则CyclicBarrier可以开闸放行,此时回调给定的barrierAction * */ barrier = new CyclicBarrier(nCars, new Runnable() { public void run() { printEvent(); judge(); try { TimeUnit.MILLISECONDS.sleep(200); } catch (Exception e) { } } /** * 裁判 */ private void judge() { for (Car car : cars) { if (car.getStrides() >= FINISH_LINE) { System.out.println(car + " won!"); service.shutdownNow(); return; } } } /** * 赛事实况 */ private void printEvent() { System.out.println(TRACK); for (Car car : cars) { System.out.println(car.tracks()); } System.out.println(TRACK); } }); for (int i = 0; i < nCars; i++) { Car car = new Car(barrier, String.valueOf(i)); cars.add(car); service.execute(car); } } public static void main(String[] args) { new CarRace(7); } }
=========================================================================== --0 --1 -2 --3 -4 --5 -6 =========================================================================== =========================================================================== ---0 --1 --2 --3 -4 --5 ---6 =========================================================================== =========================================================================== ----0 ---1 ----2 ----3 --4 ---5 ----6 =========================================================================== =========================================================================== ----0 -----1 -----2 ------3 ---4 ---5 ----6 =========================================================================== =========================================================================== ----0 ------1 ------2 -------3 ----4 -----5 ----6 =========================================================================== =========================================================================== ----0 ------1 -------2 ---------3 -----4 -----5 ----6 =========================================================================== =========================================================================== -----0 --------1 --------2 ---------3 -----4 ------5 -----6 =========================================================================== =========================================================================== -------0 ---------1 ----------2 ----------3 ------4 ------5 ------6 =========================================================================== =========================================================================== -------0 ---------1 ------------2 -----------3 ------4 ------5 ------6 =========================================================================== =========================================================================== -------0 -----------1 ------------2 ------------3 --------4 -------5 -------6 =========================================================================== =========================================================================== -------0 -------------1 ------------2 --------------3 --------4 -------5 --------6 =========================================================================== =========================================================================== ---------0 ---------------1 -------------2 ---------------3 ----------4 -------5 ----------6 =========================================================================== =========================================================================== -----------0 ---------------1 --------------2 ---------------3 ----------4 --------5 ------------6 =========================================================================== =========================================================================== ------------0 ----------------1 ----------------2 ---------------3 ------------4 --------5 ------------6 =========================================================================== =========================================================================== ------------0 ----------------1 ------------------2 ---------------3 -------------4 --------5 --------------6 =========================================================================== =========================================================================== --------------0 -----------------1 --------------------2 ---------------3 ---------------4 ---------5 --------------6 =========================================================================== =========================================================================== ----------------0 -------------------1 ---------------------2 ----------------3 -----------------4 ---------5 ---------------6 =========================================================================== =========================================================================== -----------------0 --------------------1 ---------------------2 ----------------3 -----------------4 -----------5 ----------------6 =========================================================================== =========================================================================== -------------------0 --------------------1 ----------------------2 ----------------3 -----------------4 -------------5 ----------------6 =========================================================================== =========================================================================== ---------------------0 ---------------------1 ----------------------2 ------------------3 -----------------4 ---------------5 -----------------6 =========================================================================== =========================================================================== ----------------------0 ---------------------1 ----------------------2 --------------------3 -------------------4 -----------------5 -------------------6 =========================================================================== =========================================================================== -----------------------0 ----------------------1 ----------------------2 ----------------------3 -------------------4 -------------------5 ---------------------6 =========================================================================== =========================================================================== ------------------------0 ----------------------1 ------------------------2 -----------------------3 --------------------4 -------------------5 -----------------------6 =========================================================================== =========================================================================== --------------------------0 ----------------------1 --------------------------2 -------------------------3 --------------------4 -------------------5 -------------------------6 =========================================================================== =========================================================================== --------------------------0 ----------------------1 ---------------------------2 ---------------------------3 --------------------4 --------------------5 -------------------------6 =========================================================================== =========================================================================== ---------------------------0 ------------------------1 -----------------------------2 ---------------------------3 ---------------------4 ---------------------5 --------------------------6 =========================================================================== =========================================================================== ---------------------------0 -------------------------1 -------------------------------2 ---------------------------3 ----------------------4 ---------------------5 ----------------------------6 =========================================================================== =========================================================================== -----------------------------0 --------------------------1 -------------------------------2 ---------------------------3 -----------------------4 ----------------------5 ------------------------------6 =========================================================================== =========================================================================== ------------------------------0 --------------------------1 --------------------------------2 -----------------------------3 ------------------------4 ----------------------5 --------------------------------6 =========================================================================== =========================================================================== -------------------------------0 ---------------------------1 ----------------------------------2 -------------------------------3 --------------------------4 ----------------------5 ---------------------------------6 =========================================================================== =========================================================================== -------------------------------0 ---------------------------1 ----------------------------------2 ---------------------------------3 --------------------------4 ------------------------5 -----------------------------------6 =========================================================================== =========================================================================== ---------------------------------0 ----------------------------1 -----------------------------------2 ----------------------------------3 ---------------------------4 ------------------------5 -----------------------------------6 =========================================================================== =========================================================================== -----------------------------------0 ----------------------------1 -------------------------------------2 ----------------------------------3 ---------------------------4 -------------------------5 -----------------------------------6 =========================================================================== =========================================================================== -----------------------------------0 ------------------------------1 ---------------------------------------2 -----------------------------------3 ---------------------------4 ---------------------------5 -------------------------------------6 =========================================================================== =========================================================================== -----------------------------------0 ------------------------------1 ----------------------------------------2 ------------------------------------3 ---------------------------4 -----------------------------5 -------------------------------------6 =========================================================================== =========================================================================== -----------------------------------0 -------------------------------1 ------------------------------------------2 ------------------------------------3 ---------------------------4 -----------------------------5 -------------------------------------6 =========================================================================== =========================================================================== -------------------------------------0 --------------------------------1 ------------------------------------------2 -------------------------------------3 ---------------------------4 -----------------------------5 ---------------------------------------6 =========================================================================== =========================================================================== --------------------------------------0 ----------------------------------1 ------------------------------------------2 ---------------------------------------3 ---------------------------4 ------------------------------5 ---------------------------------------6 =========================================================================== =========================================================================== ----------------------------------------0 ------------------------------------1 --------------------------------------------2 ---------------------------------------3 -----------------------------4 -------------------------------5 ----------------------------------------6 =========================================================================== =========================================================================== ----------------------------------------0 --------------------------------------1 ----------------------------------------------2 ----------------------------------------3 -------------------------------4 -------------------------------5 -----------------------------------------6 =========================================================================== =========================================================================== ----------------------------------------0 ---------------------------------------1 -----------------------------------------------2 -----------------------------------------3 -------------------------------4 ---------------------------------5 -------------------------------------------6 =========================================================================== =========================================================================== -----------------------------------------0 -----------------------------------------1 ------------------------------------------------2 ------------------------------------------3 -------------------------------4 -----------------------------------5 ---------------------------------------------6 =========================================================================== =========================================================================== ------------------------------------------0 -------------------------------------------1 ------------------------------------------------2 -------------------------------------------3 ---------------------------------4 ------------------------------------5 ---------------------------------------------6 =========================================================================== =========================================================================== --------------------------------------------0 -------------------------------------------1 ------------------------------------------------2 -------------------------------------------3 ---------------------------------4 ------------------------------------5 -----------------------------------------------6 =========================================================================== =========================================================================== --------------------------------------------0 ---------------------------------------------1 --------------------------------------------------2 -------------------------------------------3 -----------------------------------4 -------------------------------------5 -------------------------------------------------6 =========================================================================== =========================================================================== ----------------------------------------------0 ----------------------------------------------1 --------------------------------------------------2 -------------------------------------------3 -------------------------------------4 -------------------------------------5 --------------------------------------------------6 =========================================================================== =========================================================================== ------------------------------------------------0 -----------------------------------------------1 ---------------------------------------------------2 ---------------------------------------------3 ---------------------------------------4 --------------------------------------5 ----------------------------------------------------6 =========================================================================== =========================================================================== -------------------------------------------------0 ------------------------------------------------1 -----------------------------------------------------2 ---------------------------------------------3 ----------------------------------------4 ----------------------------------------5 -----------------------------------------------------6 =========================================================================== =========================================================================== ---------------------------------------------------0 --------------------------------------------------1 ------------------------------------------------------2 ----------------------------------------------3 ----------------------------------------4 -----------------------------------------5 -------------------------------------------------------6 =========================================================================== =========================================================================== ----------------------------------------------------0 ---------------------------------------------------1 --------------------------------------------------------2 ------------------------------------------------3 ------------------------------------------4 ------------------------------------------5 --------------------------------------------------------6 =========================================================================== =========================================================================== ------------------------------------------------------0 -----------------------------------------------------1 ----------------------------------------------------------2 ------------------------------------------------3 ------------------------------------------4 ------------------------------------------5 ----------------------------------------------------------6 =========================================================================== =========================================================================== ------------------------------------------------------0 -------------------------------------------------------1 -----------------------------------------------------------2 ------------------------------------------------3 ------------------------------------------4 ------------------------------------------5 ------------------------------------------------------------6 =========================================================================== =========================================================================== ------------------------------------------------------0 --------------------------------------------------------1 ------------------------------------------------------------2 ------------------------------------------------3 -------------------------------------------4 -------------------------------------------5 -------------------------------------------------------------6 =========================================================================== =========================================================================== ------------------------------------------------------0 ---------------------------------------------------------1 ------------------------------------------------------------2 --------------------------------------------------3 -------------------------------------------4 ---------------------------------------------5 --------------------------------------------------------------6 =========================================================================== =========================================================================== -------------------------------------------------------0 ----------------------------------------------------------1 ------------------------------------------------------------2 ----------------------------------------------------3 ---------------------------------------------4 -----------------------------------------------5 --------------------------------------------------------------6 =========================================================================== =========================================================================== --------------------------------------------------------0 ------------------------------------------------------------1 ------------------------------------------------------------2 ------------------------------------------------------3 ---------------------------------------------4 -------------------------------------------------5 ---------------------------------------------------------------6 =========================================================================== =========================================================================== ----------------------------------------------------------0 --------------------------------------------------------------1 -------------------------------------------------------------2 ------------------------------------------------------3 -----------------------------------------------4 ---------------------------------------------------5 ----------------------------------------------------------------6 =========================================================================== =========================================================================== -----------------------------------------------------------0 ----------------------------------------------------------------1 ---------------------------------------------------------------2 ------------------------------------------------------3 -----------------------------------------------4 -----------------------------------------------------5 ------------------------------------------------------------------6 =========================================================================== =========================================================================== -------------------------------------------------------------0 -----------------------------------------------------------------1 ---------------------------------------------------------------2 ------------------------------------------------------3 -----------------------------------------------4 -----------------------------------------------------5 -------------------------------------------------------------------6 =========================================================================== =========================================================================== -------------------------------------------------------------0 -------------------------------------------------------------------1 ---------------------------------------------------------------2 -------------------------------------------------------3 -------------------------------------------------4 -------------------------------------------------------5 --------------------------------------------------------------------6 =========================================================================== =========================================================================== ---------------------------------------------------------------0 -------------------------------------------------------------------1 -----------------------------------------------------------------2 --------------------------------------------------------3 --------------------------------------------------4 -------------------------------------------------------5 --------------------------------------------------------------------6 =========================================================================== =========================================================================== ---------------------------------------------------------------0 -------------------------------------------------------------------1 -----------------------------------------------------------------2 ---------------------------------------------------------3 ----------------------------------------------------4 --------------------------------------------------------5 ----------------------------------------------------------------------6 =========================================================================== =========================================================================== -----------------------------------------------------------------0 -------------------------------------------------------------------1 -----------------------------------------------------------------2 ----------------------------------------------------------3 -----------------------------------------------------4 --------------------------------------------------------5 ------------------------------------------------------------------------6 =========================================================================== =========================================================================== ------------------------------------------------------------------0 --------------------------------------------------------------------1 -------------------------------------------------------------------2 -----------------------------------------------------------3 -------------------------------------------------------4 ---------------------------------------------------------5 --------------------------------------------------------------------------6 =========================================================================== =========================================================================== -------------------------------------------------------------------0 ----------------------------------------------------------------------1 -------------------------------------------------------------------2 -----------------------------------------------------------3 --------------------------------------------------------4 ---------------------------------------------------------5 --------------------------------------------------------------------------6 =========================================================================== =========================================================================== -------------------------------------------------------------------0 -----------------------------------------------------------------------1 --------------------------------------------------------------------2 -------------------------------------------------------------3 ----------------------------------------------------------4 ---------------------------------------------------------5 ---------------------------------------------------------------------------6 =========================================================================== [car 6] won!
相关推荐
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类或者实现`Runnable`接口。 1. **继承Thread类*...
在Java编程中,多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高了系统的效率和响应性。然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程...
`Semaphore`信号量控制对有限资源的访问,`CountDownLatch`计数器用于等待一组线程完成操作,`CyclicBarrier`循环栅栏允许一组线程等待彼此到达某个点后再继续执行,而`Phaser`是Java 7引入的更高级的同步工具。...
RedSpider社区的这个压缩包“多线程精品资源”显然是一个集合了社区成员原创和维护的关于Java多线程的系列文章,旨在帮助开发者深入理解和掌握多线程的核心概念及实践技巧。 1. **线程基础** - **线程的定义**:...
《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...
Java多线程端口扫描是网络管理与安全领域中常用的一种技术,主要用于检测网络设备上哪些端口处于开放状态,从而分析网络的安全性或者优化网络配置。本程序通过利用Java的多线程特性,提高了扫描速度,使得在短时间内...
Java并发编程中的栅栏(CyclicBarrier)是一个同步辅助类,它允许一组线程等待彼此到达某个特定点,然后一起继续执行。这个特定点被称为屏障点。与闭锁(CountDownLatch)不同,闭锁通常是一次性的,而CyclicBarrier...
Java多线程与线程安全在实际开发中扮演着至关重要的角色,特别是在处理并发操作时。本项目聚焦于Java中的多线程技术和基于Http协议的断点续传功能,这在大文件传输、网络下载场景中尤其常见。下面将详细阐述这两个...
一、Java多线程 Java通过Thread类和Runnable接口支持多线程。Thread类代表一个线程,而Runnable接口则定义了线程执行的任务。创建新线程主要有两种方式: 1. 继承Thread类:创建一个新的类,继承自Thread,然后...
【Java多线程简单下载器】是一个初学者的编程作业,虽然代码可能较为混乱,但其核心功能已经实现,即通过多线程技术进行文件的下载。在Java中,多线程是并发处理的重要手段,它允许多个任务在同一时间执行,从而提高...
在Java编程中,线程间的通信是多线程编程中的一个重要概念,特别是在处理并发和协作任务时。生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口或者继承`Thread`类。 首先,让我们从创建线程开始。当你...
这份“Java多线程编程指南”深入探讨了这一主题,为中级到高级的Java开发者提供了宝贵的资源。 首先,多线程的基础概念是理解整个主题的关键。线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、...
在Java编程领域,线程是并发处理的核心概念,它允许程序在同一时间...理解并熟练掌握这些知识点,对于解决Java并发问题和优化多线程应用至关重要。在实际工作中,还需要关注线程安全、性能优化和代码可维护性等问题。
总结起来,"Java多线程实例图形版"是一个结合理论与实践的教学资源,通过“哲学家就餐问题”这一经典案例,帮助开发者理解多线程的基本概念、并发问题以及解决策略。通过学习这个实例,不仅可以掌握Java多线程编程的...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
Java多线程与锁是Java并发编程中的核心概念,它们在构建高效、可扩展的并发应用程序中起着至关重要的作用。下面将详细讲解这两个主题。 首先,Java中的多线程是指程序执行时可以同时进行多个任务。这得益于操作系统...
本示例代码集合("java多线程代码demo")涵盖了多线程的多种实现方式,包括Thread类和Runnable接口的使用,以及对死锁的理解与避免。通过以下详细解释,你可以深入了解Java多线程的原理和实践。 1. **Thread类**:...
总结来说,实现"java多线程实现乒乓球双打"需要对Java的线程API有深入的理解,包括线程的创建与启动、同步与通信机制、并发控制工具的使用以及设计模式的应用。通过这种方式,我们可以构建出一个生动有趣的模拟游戏...
总之,这个项目实例旨在帮助开发者掌握Java多线程技术,提升处理高并发场景的能力,这对于在人工智能领域进行大数据处理和实时计算的项目尤其重要。通过对这些实例的学习和实践,你将能够更好地驾驭Java并发编程,为...