当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

CountDownLatch和CyclicBarrier初步学习

发表于: 2013-12-06   作者:dreamoftch   来源:转载   浏览次数:
摘要:   CountDownLatch用法:   需要调用CountDownLatch的await()方法来等待计数器归零(线程全部签到)。调用CountDownLatch的countDown()方法让计数器减一(签到)   package com.tch.test.concurrent.test; import java.util.Random; imp

 

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初步学习

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
CountDownLatch 是一个通用同步工具,它有很多用途,将计数 1 初始化的 CountDownLatch 用作一个简单
CountDownLatch 是一个通用同步工具,它有很多用途,将计数 1 初始化的 CountDownLatch 用作一个简单
Cordic算法又称为:坐标旋转数字计算方法,在最初是作为坐标变换的算法,现在发展为计算各种复杂函
还记得开心网,人人网这些SNS刚出来时,它们中有的功能,比如是要导入GOOGLE,MSN的联系人列表,这
还记得开心网,人人网这些SNS刚出来时,它们中有的功能,比如是要导入GOOGLE,MSN的联系人列表,这
还记得开心网,人人网这些SNS刚出来时,它们中有的功能,比如是要导入GOOGLE,MSN的联系人列表,这
在实习过程中,在写共同函数的过程中遇到了麻烦。vss管理版本的更新非常麻烦。本次实习用的是struts
首先我们看下下面的Apache CXF 结构图。 BUS 总线,这个是Apache CXF 的核心类,管理类,同时也装载
还记得开心网,人人网这些SNS刚出来时,它们中有的功能,比如是要导入GOOGLE,MSN的联系人列表,这
版本控制系统version control system 多人协作开发 历史记录 恢复到任意历史版本-代码状态 错误恢复
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号