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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java线程与并发编程实践----同步器(倒计时门闩)相关的知识,希望对你有一定的参考价值。

    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线程与并发编程实践----同步器(倒计时门闩)的主要内容,如果未能解决你的问题,请参考以下文章

Java线程与并发编程实践----同步器(交换器信号量)

Java线程与并发编程实践----同步

Java编程的逻辑 (81) - 并发同步协作工具

Java线程与并发编程实践----锁框架

Java线程与并发编程实践----额外的并发工具类

java并发编程的艺术——第五章总结(Lock锁与队列同步器)