`
dreamoftch
  • 浏览: 485140 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

CountDownLatch和CyclicBarrier初步学习

阅读更多

 

CountDownLatch用法:

 

需要调用CountDownLatch的await()方法来等待计数器归零(线程全部签到)。调用CountDownLatch的countDown()方法让计数器减一(签到)

 

package com.tch.test.concurrent.test;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchTest {
	/** 线程数 */
	private int num = 3;
	private Random random = new Random();
	/** 开始运行的计数器 */
	private CountDownLatch begin = new CountDownLatch(1);
	/** 所有线程签到的计数器 */
	private CountDownLatch end = new CountDownLatch(num);
	private ExecutorService executor = Executors.newFixedThreadPool(5);
	
	public static void main(String[] args) {
		new CountDownLatchTest().test();
	}

	private void test() {
		try {
			doTask();
			System.out.println( "开始 ");
			//发出开始运行的信号
			begin.countDown();
			//主线程等待end计数器减到0,也就是所有线程都完成签到(end.countDown())
			end.await();
			System.out.println("结束 "+System.currentTimeMillis());
			executor.shutdown();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	private void doTask(){
		for(int i=0;i<num;i++){
			executor.execute(new Task(i));
		}
	}
	
	class Task implements Runnable{
		private int id;
		public Task(int id){
			this.id = id;
		}
		@Override
		public void run() {
			try {
				//等待begin的计数器减到0,导致当前线程进入阻塞状态
				begin.await();
				Thread.sleep(random.nextInt(1500));
				System.out.println("线程"+id+"结束"+System.currentTimeMillis());
				//向end计数器报到,end计时器减一
				end.countDown();
				//等待end计数器减到0,也就是等待所有线程都完成
				end.await();
				System.out.println("全部线程结束 "+System.currentTimeMillis());
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

 

 

 

 

CyclicBarrier用法:

 

调用CyclicBarrier的await()方法来签到 并且 等待其它线程全部签到完成。

 

package com.tch.test.concurrent.test;

import java.util.Random;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CyclicBarrierTest {
	private CyclicBarrier barrier;
	/** 线程数 */
	private int num = 3;
	private Random random = new Random();
	private ExecutorService executor = Executors.newFixedThreadPool(5);

	public static void main(String[] args) {
		new CyclicBarrierTest().test();
	}

	private void test() {
		barrier = new CyclicBarrier(num, new Runnable() {
			@Override
			public void run() {
				System.out.println("全部签到完成"+System.currentTimeMillis());
				System.out.println(barrier.getNumberWaiting()+"  "+barrier.getParties());
				//barrier.reset();
				System.out.println("--------------重新开始------------");
				doTask();
			}
		});
		doTask();
		barrier.reset();
		//executor.shutdown();
	}
	//barrier.reset();
	private void doTask(){
		for(int i=0;i<num;i++){
			executor.execute(new Task(i));
		}
	}
	
	class Task implements Runnable{
		private int id;
		public Task(int id){
			this.id = id;
		}
		@Override
		public void run() {
			try {
				Thread.sleep(random.nextInt(1500));
				System.out.println("线程"+id+"结束"+System.currentTimeMillis());
				barrier.await();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

分享到:
评论

相关推荐

    CountDownLatch和CyclicBarrier用法实例大全

    《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法

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

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

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

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

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    CountDownLatch 和 CyclicBarrier 为线程同步的辅助工具,通过它可以做到使一条线程一直阻塞等待,直到其他线程完成其所处理的任务。

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用 CountDownLatch、CyclicBarrier、Semaphore这些线程协作工具类是基于AQS的,看完这篇博客后可以去看下面这篇博客,了解它们是如何实现的。 Java并发...

    CountDownLatch、CyclicBarrier、Semaphore.md

    java 高并发应用场景

    详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别

    主要介绍了详解java CountDownLatch和CyclicBarrier在内部实现和场景上的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    主要介绍了Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解的相关资料,需要的朋友可以参考下

    Java并发编程学习笔记

    7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...

    Java进阶教程,面试大全,包罗万象

    Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。

    Java进阶教程,面试大全

    Java进阶教程,面试大全1,可参考以下问题: Semaphore-信号灯机制。 synchronized在静态方法和普通方法的区别。 怎么实现所有线程在等待某个事件的发生...CountDownLatch和CyclicBarrier的用法,以及相互之间的差别。

    Java中的CountDownLatch类最全讲义

    目录: 简介 1.1 并发编程与线程同步 1.2 CountDownLatch概述 CountDownLatch的基本用法 2.1 创建CountDownLatch对象 2.2 await()方法 ...CountDownLatch与CyclicBarrier的对比 最佳实践与注意事项

    JUC多线程学习个人笔记

    JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于...并发工具类:JUC提供了一些并发编程的工具类,如Semaphore、CountDownLatch、CyclicBarrier等,可以实现线程间的协作和同步。

    Concurrent包的小例子

    Concurrent下的例子,涵盖了大部分常用类 例如BlockingQueue、CountDownLatch、CyclicBarrier、Exchanger、ExecuteService、lock、timeutil等

    CountDownLatch学习用法

    在网上找的一个CountDownLatch的学习demo,感觉很不错,就摘抄过来了

    阿里P7面试题整理集合

    interitableThreadLocals)、lock和sync区别(问HashMap1.7、1.8区别时带出)、 AQS原理(执行过程源码,入队出队的细节,源码细节)、CountDownLatch和 CyclicBarrier的区别是什么源码级别、volatile从指令重排序,...

    CyclicBarrier用法.docx

    与CountDownLatch不同的是,CyclicBarrier可以重复使用,即当所有线程都到达屏障后,屏障会自动重置,可以继续使用。 CyclicBarrier的构造方法如下: java public CyclicBarrier(int parties, Runnable ...

    multiThread.jpg

    Java多线程技术思维导图,覆盖全面,可用作学习指导和查缺补漏,十分高效。 涵盖线程中断、线程状态、线程间通信,并发容器、ThreadLocal、Synchronized、CountDownLatch、CyclicBarrier等内容。

    Java并发编程基础.pdf

    Java并发编程基础主要包括以下几个核心方面: ...并发工具类:掌握Java并发包java.util.concurrent中提供的各种工具类,如CountDownLatch、CyclicBarrier、Semaphore等,它们简化了并发编程的复杂性。

Global site tag (gtag.js) - Google Analytics