`
alchimie
  • 浏览: 19634 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[Java并发编程实战] 读书笔记(1):闭锁

 
阅读更多

闭锁(Latch)

闭锁(Latch):一种同步工具类,可以延迟线程的进度直到其到达终止状态。其作用相当于一扇门,这扇门打开之前,所有线程的将被阻塞在门前,只有在门打开后,所有的线程才能通过。并且门(闭锁)的状态是一次性的(栅栏则是可控),只要门一打开,就不能再关闭。闭锁可以用来确保某些活动直到其它活动都完成后才继续执行。

 

CountDownLatch是java.util.concurrent包里关于闭锁的一种实现,其API如下: 

public CountDownLatch(int count)

// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断

public void await() throws InterruptedException

// 使当前线程在锁存器倒计数至零之前一直等待,除非线程被 中断或超出了指定的等待时间。 

public boolean await(long timeout, TimeUnit unit) throws InterruptedException

// 倒计数

public void countDown()

// 返回当前计数

public long getCount() 

 

上代码(JCIP5-5加上注释和main()):

 

/**
 * TestHarness Using CountDownLatch for starting and stopping threads in timing
 * tests
 * 
 * @author Brian Goetz and Tim Peierls
 * @author Modified by alchimie
 */
public class TestHarness {
	public long timeTasks(int nThreads, final Runnable task)
			throws InterruptedException {
		// 起始门
		final CountDownLatch startGate = new CountDownLatch(1);
		// 终止门
		final CountDownLatch endGate = new CountDownLatch(nThreads);

		for (int i = 0; i < nThreads; i++) {
			Thread t = new Thread() {
				public void run() {
					try {
						System.out.println("线程"
								+ Thread.currentThread().getName() + "等待执行");
						// 线程等待闭锁打开
						startGate.await();
						try {
							task.run();
						} finally {
							endGate.countDown();
						}
					} catch (InterruptedException ignored) {
					}
				}
			};
			t.start();
		}

		long start = System.nanoTime();
		// 加入一小段等待时间让所有线程就绪
		Thread.sleep(100);
		startGate.countDown();
		System.out.println("线程" + Thread.currentThread().getName() + "等待");
		// 主线程等待所有子线程运行结束
		endGate.await();
		System.out.println("线程" + Thread.currentThread().getName() + "执行");
		long end = System.nanoTime();
		return end - start;
	}

	public static void main(String args[]) {
		TestHarness th = new TestHarness();
		try {
			long time = th.timeTasks(5, new Thread(new Runnable() {
				public void run() {
					System.out.println("线程" + Thread.currentThread().getName()
							+ "执行完毕");
				}
			}));
			System.out.println("统计时间" + time);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

 

执行结果:

线程Thread-1等待执行

线程Thread-4等待执行

线程Thread-3等待执行

线程Thread-2等待执行

线程Thread-5等待执行

线程main等待

线程Thread-1执行完毕

线程Thread-5执行完毕

线程Thread-2执行完毕

线程Thread-3执行完毕

线程Thread-4执行完毕

线程main执行

统计时间100455504

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics