码迷,mamicode.com
首页 > 编程语言 > 详细

Java线程与并发编程实践----同步器(倒计时门闩)

时间:2018-01-17 01:16:02      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:bar   countdown   开始   tle   ado   roc   vpd   main   ace   

    Java提供的synchronized关键字对临界区进行线程同步访问。由于基于synchronized很难

正确编写同步代码,并发工具类提供了高级的同步器。倒计时门闩(countdown latch)、同步屏

障(cyclic barrier)、交换器(exchanger)、信号量(semaphore)以及phaser同步器。下面主要

介绍倒计时门闩。

    倒计时门闩会导致一条或多条线程在“门口”一直等待,直到另一条线程打开这扇门,线程

才得以继续运行。他是由一个计数变量和两个操作组成的,这两个操作分别是“导致一条线程等待直到

计数变为0”以及“递减计数变量”。

实现类:java.util.concurrent.CountDownLatch

技术分享图片

    以下代码是用倒计时门闩实现的一个是所有线程同时执行同时结束之后,才能继续执行主线程:

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

public class Test {
	final static int NTHREADS = 3;
	public static void main(String[] args) {
		final CountDownLatch startSignal = new CountDownLatch(1);
		final CountDownLatch doneSignal = new CountDownLatch(NTHREADS);
		Runnable r = new Runnable() {
			
			@Override
			public void run() {
				try {
					System.out.println(Thread.currentThread().getName() + "进入等待");
					startSignal.await();
					System.out.println(Thread.currentThread().getName() + "开始执行任务");
					Thread.sleep(200);
					doneSignal.countDown();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		};
		ExecutorService es = Executors.newFixedThreadPool(NTHREADS);
		for (int i = 0; i < NTHREADS; i++) {
			es.execute(r);
		}
			try {
				Thread.sleep(1000);
				startSignal.countDown();
				System.out.println(Thread.currentThread().getName() + "进入等待");
				doneSignal.await();
				System.out.println(Thread.currentThread().getName() + "开始执行");
				es.shutdownNow();
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
	}
}


Java线程与并发编程实践----同步器(倒计时门闩)

标签:bar   countdown   开始   tle   ado   roc   vpd   main   ace   

原文地址:http://blog.51cto.com/12222886/2061773

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!