countdownlatch_demo和CyclicBarrier_demo

代码参考https://www.cnblogs.com/nullzx/p/5272807.html

package Thread;

import java.util.*;
import java.util.concurrent.*;

//控制一个线程等待多个线程
public class CountDownLatchDemo {
	// a、b、c、d同时交给线程池,c、d会在a、b结束后开始执行;
	// 重点是countDown和await方法
	private CountDownLatch latch = new CountDownLatch(2);
	private Random rmd = new Random();

	class FirstTask implements Runnable {
		private String id;

		public FirstTask(String id) {
			this.id = id;
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("Thread " + id + " is start");
			try {
				Thread.sleep(rmd.nextInt(1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("Thread " + id + " is over");

			// 执行countdown会减1
			latch.countDown();
		}

	}

	class SecondTask implements Runnable {
		private String id;

		public SecondTask(String id) {
			this.id = id;
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			try {
				// 等待,count=0时立刻执行
				latch.await();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("----------Thread " + id + " is start");
			try {
				Thread.sleep(rmd.nextInt(1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("----------Thread " + id + " is over");
		}

	}

	public static void main(String[] args) {
		ExecutorService es = Executors.newCachedThreadPool();
		CountDownLatchDemo latchDemo = new CountDownLatchDemo();
		es.submit(latchDemo.new SecondTask("c"));
		es.submit(latchDemo.new SecondTask("d"));
		es.submit(latchDemo.new FirstTask("a"));
		es.submit(latchDemo.new FirstTask("b"));
		es.shutdown();
	}

}

https://blog.csdn.net/u011345136/article/details/46842183

package Thread;

import java.util.*;
import java.util.concurrent.*;
//一个主任务等待两个子任务,通过CyclicBarrier的await()实现,
//此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。
public class CyclicBarrierDemo {
	class MainTask implements Runnable {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("-----主任务开始执行-----");
		}

	}

	class SubTask implements Runnable {
		private String name;
		private CyclicBarrier cyclicBarrier;

		public SubTask(String name, CyclicBarrier cyclicBarrier) {
			// TODO Auto-generated constructor stub
			this.name = name;
			this.cyclicBarrier = cyclicBarrier;
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("[子任务" + name + "]开始执行了!");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("[子任务" + name + "]执行完成了,并通知障碍器已经完成了");
			try {
				// 执行await方法+1
				cyclicBarrier.await();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (BrokenBarrierException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		CyclicBarrierDemo cDemo = new CyclicBarrierDemo();
		CyclicBarrier cyclicBarrier = new CyclicBarrier(2, cDemo.new MainTask());
		//CyclicBarrier cyclicBarrier = new CyclicBarrier(2, null);
		SubTask A = cDemo.new SubTask("A", cyclicBarrier);
		SubTask B = cDemo.new SubTask("B", cyclicBarrier);
		ExecutorService executor = Executors.newCachedThreadPool();
		executor.execute(A);
		executor.execute(B);
		executor.shutdown();
	}

}

猜你喜欢

转载自blog.csdn.net/wenyimutouren/article/details/82285371