`

java同步器

    博客分类:
  • java
阅读更多
    在jdk1.5的concurrent包下提供了一些有意思的同步器,以前做线程间的通信用的就是wait,
notify,现在在concurrent包下一句封装了细节,让我们在更高的层次上进行线程间的同步、通信。
   
    一:CyclicBarrier

        循环屏障点,它允许一组线程相互等待,知道到达某个屏障点Brrrier.套用《java并发编程实践》书籍中的例子就是,当几个旅行团要途径A、B、C,其中这几个旅行团做的坐的交通工具不相同,有1绿色1路车,有自驾游,有坐大巴,但是有一条,在到达某一个点,比方这里是A,先到的必须要等待后到的,直到全部到达,然后,才出发第二点个点。
     模拟的程序如下(例子出处《java并发编程实践》,因为我想不到其他更好一点的例子):

   
/**
 *
 * @author li jian
 * @mail brzone@126.com
 * @date 2012-9-10 下午05:12:18
 */
public class RunTask implements Runnable {

	private CyclicBarrier barrier;

	private int[] SencondTimeForWait;

	private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	public RunTask(CyclicBarrier barrier, int[] sencondTimeForWait) {
		super();
		this.barrier = barrier;
		SencondTimeForWait = sencondTimeForWait;
	}

	@Override
	public void run() {

		for(int stepTime: SencondTimeForWait) {

			try {
				TimeUnit.SECONDS.sleep(stepTime);
				System.out.println(getCurrentTime() 
                                +  "\t" + Thread.currentThread().getName() 
                                +  " has reached.");



				/**
				 * 当到达某一个屏障点,就等待。
				 *
				 * 可以利用类似信号量来做比方:
				 *              刚刚开始的信号量,是new出来CyclicBarrier传进去的值,
				 *              这里是3,可以理解是:await()一次,其信号量减1,然后
				 *              进入堵塞,直到信号量为0,此时,唤醒全部堵塞的线程,使
				 *              其线程全部继续执行,并把信号量恢复到原来创建时的值,
				 *              这样便可以循环的执行下去。
				 *
				 *
				 */

				barrier.await();

			} catch (InterruptedException e) {

				e.printStackTrace();
				throw new RuntimeException(e);
			} catch (BrokenBarrierException e) {

				e.printStackTrace();
				throw new RuntimeException(e);
			}


		}

	}


	private String getCurrentTime() {

		return sdf.format(new java.util.Date());
	}


	/**
	 * just for test Date format is ok
	 * @param args
	 */
	public static void main(String[] args) {

		System.out.println(sdf.format(new java.util.Date()));

	}

}


/**
*
* @author li jian
* @mail brzone@126.com
* @date 2012-9-10 下午05:03:22
*/
public class CyclicBarrierDemo {

private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


public static void main(String[] args) {

int[] walkTime = {5,8,10};

int[] driverCarBySelf = {1,2,3};

int[] driverbus = {2,4,6};

//当到达某一屏障点的时候,由最后一个到达屏障点的线程执行该任务。
CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {

@Override
public void run() {
System.out.println(sdf.format(new java.util.Date())
+ "\t" + Thread.currentThread().getName()
+ "\twe all reached.");

}
});

//起三个线程执行器
ExecutorService exec = Executors.newFixedThreadPool(3);
//执行任务
exec.submit(new RunTask(barrier, walkTime));
exec.submit(new RunTask(barrier, driverCarBySelf));
exec.submit(new RunTask(barrier, driverbus));

exec.shutdown();

}

}


打出日志:
2012-09-10 17:17:22 pool-1-thread-2 has reached.
2012-09-10 17:17:23 pool-1-thread-3 has reached.
2012-09-10 17:17:26 pool-1-thread-1 has reached.
2012-09-10 17:17:26 pool-1-thread-1 we all reached.
2012-09-10 17:17:28 pool-1-thread-2 has reached.
2012-09-10 17:17:30 pool-1-thread-3 has reached.
2012-09-10 17:17:34 pool-1-thread-1 has reached.
2012-09-10 17:17:34 pool-1-thread-1 we all reached.
2012-09-10 17:17:37 pool-1-thread-2 has reached.
2012-09-10 17:17:40 pool-1-thread-3 has reached.
2012-09-10 17:17:44 pool-1-thread-1 has reached.
2012-09-10 17:17:44 pool-1-thread-1 we all reached.

很明显是最晚到达一个thread打出到达屏障点的Runnable,且在都到达屏障点后才继续执行。
分享到:
评论

相关推荐

    java 同步器SynchronousQueue详解及实例

    主要介绍了java 同步器SynchronousQueue详解及实例的相关资料,需要的朋友可以参考下

    java同步大杀器concurrent 包

    java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大...

    Java分布式应用学习笔记05多线程下的并发同步器

    Java分布式应用学习笔记05多线程下的并发同步器

    Java多线程同步器代码详解

    主要介绍了Java多线程同步器代码详解,文章分别介绍了是CountDownLatch,Semaphore,Barrier和Exchanger以及其相关代码示例,具有一定参考价值,需要的朋友可以了解下。

    Java并发编程解析 | 解析AQS基础同步器的设计与实现

    Java并发编程解析 | 解析AQS基础同步器的设计与实现

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    带你看看Java-AQS同步器 源码解读四 条件队列Condition上

    Java-AQS同步器 源码解读-条件队列Condition前文为什么需要条件队列Conditon Queue举个小例子分析怎么使用条件队列写个小DemoJDK中是怎么使用的Lock和ConditionLockConditionSync-Queue和Conditian-QueueAQS ...

    java源码包实例源码JAVA开发源码55个合集.zip

    Java游戏中斜视角编辑器及引擎源代码.rar Java游戏使命的召唤源码.rar Java游戏沙丘城堡源代码.rar Java源码的仿QQ聊天程序.rar Java用GZIP压缩解压文件.rar Java用Zip压缩多个文件实例源码.rar Java用的在线地图...

    JAVA_API1.6文档(中文)

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 ...

    java多线程编程同步器Future和FutureTask解析及代码示例

    主要介绍了java多线程编程同步器Future和FutureTask解析及代码示例,对二者进行了详细介绍,分析了future的源码,最后展示了相关实例代码,具有一定参考价值 ,需要的朋友可以了解下。

    lettuce-高级JavaRedis客户端用于线程安全同步异步和reactive用法

    lettuce - 高级Java Redis客户端,用于线程安全同步,异步和reactive用法。 支持群集,Sentinel,管道和编解码器。

    java多线程编程总结

    详细的讲述了多线程的各种用法 Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 ...Java线程:新特征-障碍器 Java线程:大总结

    Java 1.6 API 中文 New

    java.util.concurrent.locks 为锁和等待条件提供一个框架的接口和类,它不同于内置同步和监视器。 java.util.jar 提供读写 JAR (Java ARchive) 文件格式的类,该格式基于具有可选清单文件的标准 ZIP 文件格式。 java...

    java并发编程之同步器代码示例

    主要介绍了java并发编程之同步器代码示例,分享了相关代码,具有一定参考价值,需要的朋友可以了解下。

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    Java开发技术大全(500个源代码).

    demoSynchrony.java 演示线程的同步 setDataThread.java 设置数据的线程类 readDataThread.java 读取数据的线程类 demoEnhanceThread.java 使用自己定义的线程类示例 producer_consumer.java 演示生产者-消费者...

    java中的锁.xmind

    1.同步器的主要使用方式是继承,子类通过继承同步器并实现他的抽象方法来管理同步状态(CAS线程安全操作) 2.子类通常定义为自定义同步组件的静态内部类 3.同步器是面向锁的实现者,他简化了锁的实现方式,屏蔽了...

    文件同步器,实现同步两个文件夹下所有文件

    根据文件最后一次修改时间,实现同步两个文件夹内所有文件,以达到两个文件夹下面所有文件同步的功能。 由java语言编写,可以在任意安装了jdk6.0的机器上运行。

Global site tag (gtag.js) - Google Analytics