`
543089122
  • 浏览: 153194 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

CountDownLatch、CyclicBarrier让多线程变得更简单

    博客分类:
  • java
阅读更多
CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待

CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。

这是JAVA1.5中的2个帮助类,他们2都是直接继承java.lang.Object的,目的是为了让线程之间的相互等待变得简单。


CountDownLatch的用法如下(CyclicBarrier要更加简单一些而且更加强大一些,用法参看http://www.iteye.com/topic/1116068之前写的一个测试)

package thread.concurrent.CountDownLatch;

import java.util.AbstractQueue;
import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
/**
 * CountDownLatch:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
 * 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,
 * await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。
 * 这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。 
 */
public class CountDownLatchTest {
	public static void main(String[] args) throws InterruptedException {
		int threadCount = 10;
		CountDownLatch beginSingle = new CountDownLatch(1);
		CountDownLatch endSingle = new CountDownLatch(threadCount);
		AbstractQueue<SportsMan> queue = new ArrayBlockingQueue<SportsMan>(
				threadCount);
		for (int i = 0; i < threadCount; i++) {
			new Thread(new WorkThread(queue, beginSingle, endSingle)).start();
		}
		beginSingle.countDown();//②枪响
		endSingle.await();//③使当前线程等待,直到endSingle计数器递减到0才放开
		System.out.println("统计成绩:" + queue);
	}
}

//每个线程代表一个运动员
class WorkThread implements Runnable {
	AbstractQueue<SportsMan> queue;
	CountDownLatch countDownLatch;
	CountDownLatch endSingle;

	public WorkThread(AbstractQueue<SportsMan> queue,
			CountDownLatch countDownLatch, CountDownLatch endSingle) {
		super();
		this.queue = queue;
		this.countDownLatch = countDownLatch;
		this.endSingle = endSingle;
	}

	public void run() {
		try {
			countDownLatch.await();//①运动员各就各位

			int time = (new Random()).nextInt(10);
			System.out.println("线程:" + Thread.currentThread().getName() + "用时:"
					+ time);
			queue.add(new SportsMan(Thread.currentThread().getName(), time));

			endSingle.countDown();//③每次有人跑到终点,则结束计数器递减,当结束计数器递减到0也就是所有人都跑完了就进行成绩统计。
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

// 运动员类
class SportsMan {
	String name;
	Integer time;

	public SportsMan(String name, Integer time) {
		super();
		this.name = name;
		this.time = time;
	}

	public String toString() {
		return "{name:" + name + ",time:" + time + "}";
	}
}

分享到:
评论

相关推荐

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    CountDownLatch的使用可以使得多线程程序设计变得更加简单和易于控制。 CountDownLatch的实现: CountDownLatch的实现非常简单,jdk中CountDownLatch类有一个常用的构造方法:CountDownLatch(int count);两个常用...

    如何使用CountDownLatch同步java多线程

    如何使用CountDownLatch同步java多线程 CountDownLatch 是 Java 并发编程中的一种常用工具,用于控制多个线程的并发执行。它可以实现多个线程之间的同步操作,使得线程之间可以协调工作,避免了线程之间的互相干扰...

    多线程demo程序-轻松掌握多线程技术

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在服务器端开发和高并发应用中,多线程能够充分利用CPU资源,提高程序的运行效率。这个名为"多线程demo程序-轻松掌握多线程技术"的项目,旨在帮助开发者理解...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    5. 状态对象模式:用于在多线程中同步访问对象的状态,例如CountDownLatch、CyclicBarrier和Semaphore等并发工具类,它们可以帮助我们控制线程间的同步和协作。 6. 同步适配器模式:通过包装已有的线程不安全的类,...

    JAVA多线程教材

    5. **并发集合与并发工具类**:Java提供了一系列并发友好的集合,如ConcurrentHashMap、CopyOnWriteArrayList等,以及并发工具类如CountDownLatch、CyclicBarrier和Phaser,它们用于协调多线程间的协作。 6. **异常...

    Java多线程

    - java.util.concurrent包则提供了一些高级的并发编程工具,如Executor框架、CountDownLatch、CyclicBarrier、Phaser等,用于简化多线程编程。 通过以上内容的学习,Java程序员不仅能够理解线程的概念和重要性,...

    JAVA多线程学习内容

    线程安全是多线程编程中的另一个重要概念,指在多线程环境下,类的行为不会因线程的并发执行而变得不确定。Java提供了一些线程安全的数据结构,如ArrayList不是线程安全的,但它的替代品Vector和...

    Android多线程下载实现方案

    在Android开发中,为了提升用户体验,尤其是在处理大文件下载时,多线程技术的应用变得尤为重要。本篇文章将详细探讨如何在Android中实现多线程下载功能,并涉及断点续传技术,以确保下载的高效性和可靠性。我们还将...

    Java多线程编程

    - **充分利用多处理器系统**:随着多处理器系统的普及,多线程编程变得更加重要。多线程可以让程序更好地利用多核处理器的性能,实现真正的并行处理。 - 例如,在多处理器系统中,不同的线程可以在不同的 CPU 上...

    java 多线程PDF档

    这些工具类提供了更高级别的同步原语,使得多线程编程变得更加便捷。 最后,Java的并发API自Java 5以来得到了显著增强,包括java.util.concurrent包下的许多类和接口。这些API的设计理念是提高并发性能,减少资源...

    Java_多线程编程线程:大总结

    然而,随着Java 5的发布,一系列新特性如线程池、原子量、锁等的引入,使得Java在多线程领域变得更为强大,与其他编程语言相比,其多线程处理能力显著提升。 #### 二、Java线程的基础概念 - **进程与线程**:进程...

    java多线程编程总结

    Java5之前的版本虽然支持多线程,但在语言层面的支持较为有限,这使得编写复杂的多线程程序变得非常具有挑战性。然而,随着Java5及后续版本的发布,Java引入了一系列强大的多线程特性和工具,极大地增强了多线程编程...

    多线程问题

    例如,在JDK 1.5中引入了新的并发API,并在后续版本中持续改进和优化了这些并发工具,使得Java并发编程变得更加简便和安全。 总之,Java多线程编程极大地增强了程序处理并发任务的能力,但是在享受多线程带来的好处...

    Java多线程编程总结

    Java多线程编程是Java平台的...随着Java技术的发展,如Java 5及以后版本引入的新特性,多线程编程变得更加灵活和强大。在实际开发中,根据具体需求选择合适的同步机制和线程管理方式,能够显著提升程序性能和可维护性。

    spring4+junit4.8 +多线程TheadTool

    在多线程环境下,Spring4提供了一套完善的上下文管理机制,使得线程安全的bean管理变得更加简单。 2. **Junit4.8**:JUnit4.8是一个针对Java的单元测试框架,它的主要特性包括注解(@Test)、参数化测试、异常断言...

    Java并发编程和多线程的区别

    Java提供了丰富的API来支持多线程编程,如`Thread`类和`ExecutorService`接口,使得创建和管理线程变得更加便捷和高效。 并发编程的核心挑战在于处理线程间的交互和同步问题。这包括共享数据的安全访问、避免竞态...

    JAVA中多线程技术的实现.pdf

    Java 5之后引入的java.util.concurrent包中提供了一系列的并发工具类,如`CountDownLatch`、`CyclicBarrier`、`Semaphore`、`Exchanger`等,使得多线程编程变得更加高效和安全。 以上知识点只是Java多线程技术中的...

    java多线程编程实践

    综上所述,`java.util.concurrent`包为Java开发者提供了丰富的并发编程工具,使得在多线程环境下开发高性能、高可靠性的应用变得更加简单和高效。通过合理利用这些工具,可以有效解决并发编程中常见的问题,如资源...

    Java中的CyclicBarrier类最全讲义

    # Java中的CyclicBarrier类最全讲义 ...总之,`CyclicBarrier`是一个非常强大的并发工具,能够有效地帮助实现多线程间的同步和协作。通过合理的设计和使用,可以极大地提升程序的并发性能和可靠性。

Global site tag (gtag.js) - Google Analytics