1114.按序打印

1114.按序打印_第1张图片
实现代码

public class Foo {
	private CountDownLatch second = new CountDownLatch(1);
	private CountDownLatch third = new CountDownLatch(1);

	public Foo() {

	}

	public void one() {
		System.out.print("one");
	}

	public void two() {
		System.out.print("two");
	}

	public void three() {
		System.out.print("three");
	}

	public void first(Runnable printFirst) throws InterruptedException {
		printFirst.run();
		second.countDown();
	}

	public void second(Runnable printSecond) throws InterruptedException {
		second.await();
		printSecond.run();
		third.countDown();
	}

	public void third(Runnable printThird) throws InterruptedException {
		third.await();
		printThird.run();
	}

	public static void main(String[] args) {
		Foo foo = new Foo();
		Thread thread1 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					foo.first(new Runnable() {
						@Override
						public void run() {
							foo.one();
						}
					});
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		Thread thread2 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					foo.second(new Runnable() {
						
						@Override
						public void run() {
							foo.two();
						}
					});
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		Thread thread3 = new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					foo.third(new Runnable() {
						@Override
						public void run() {
							foo.three();
						}
					});
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		thread1.start();
		thread2.start();
		thread3.start();
	}
}

CountDownLatch的用法

  1. 某一线程在开始运行前等待n个线程执行完毕。将CountDownLatch的计数器初始化为new CountDownLatch(n),每当一个任务线程执行完毕,就将计数器减1,当计数器的值变为0时,在CountDownLatch上await()的线程就会被唤醒。一个典型应用场景就是启动一个服务时,主线程需要等待多个组件加载完毕,之后再继续执行。

  2. 实现多个线程开始执行任务的最大并行性。注意是并行性,不是并发,强调的是多个线程在某一时刻同时开始执行。类似于赛跑,将多个线程放到起点,等待发令枪响,然后同时开跑。做法是初始化一个共享的CountDownLatch(1),将其计算器初始化为1,多个线程在开始执行任务前首先countdownlatch.await(),当主线程调用countDown()时,计数器变为0,多个线程同时被唤醒。

你可能感兴趣的:(算法)