线程实例

下面介绍一些线程编程例子:

1.有一个任务(有三个阶段-前期准备,任务完成,后期检查),要求多个工作者参与共同完成,每个阶段必须所有的工作者完成后才可以进行下一个阶段,三个阶段都完成,总部(一个特殊的工作者)完成后期总结。

CyclicBarrier:故障点,可以重复使用---await

static class SummaryService {
		private Random random;

		SummaryService(Random random) {
			this.random = random;
		}

		void doService(String name, String phase) {
			System.out
					.println("-----------------------------------------------");
			System.out.println("任务阶段:" + phase + ",当期工作者:" + name + ",正在汇总数据");
			try {
				Thread.currentThread().sleep(random.nextInt(300));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("任务阶段:" + phase + ",当期工作者:" + name + ",汇总数据完成");
			System.out
					.println("-----------------------------------------------");
		}
	}

  

static class DataTask implements Runnable {
		private String name;
		private CyclicBarrier barrier;
		private SummaryService service;

		DataTask(String name, CyclicBarrier barrier, SummaryService service) {
			this.name = name;
			this.barrier = barrier;
			this.service = service;
		}

		@Override
		public void run() {

			service.doService(name, "前期任务准备");
			System.out.println("体系单位:[" + name
					+ "]汇总[前期任务准备都已完成],等待进入[完成任务阶段],未完成前期的单位还有:"
					+ barrier.getNumberWaiting() + "个");

			try {
				barrier.await();
			} catch (InterruptedException | BrokenBarrierException e) {
				e.printStackTrace();
			}

			service.doService(name, "完成任务");
			System.out.println("体系单位:[" + name
					+ "]汇总[完成任务工作都已完成],等待进入[监控任务阶段],未完成前期的单位还有:"
					+ barrier.getNumberWaiting() + "个");
			try {
				barrier.await();
			} catch (InterruptedException | BrokenBarrierException e) {
				e.printStackTrace();
			}

			service.doService(name, "监控任务阶段");
			System.out.println("体系单位:[" + name + "]汇总[监控任务阶段都已完成]"
					+ barrier.getNumberWaiting() + "个");
			try {
				barrier.await();
			} catch (InterruptedException | BrokenBarrierException e) {
				e.printStackTrace();
			}
		}

	}

  

public static void main(String[] args) throws InterruptedException,
			IOException {

		CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
			@Override
			public void run() {
				System.out.println("总部汇总工作!!!");
			}
		});
		SummaryService service = new SummaryService(new Random());
		new Thread(new DataTask("A单位", barrier, service)).start();
		new Thread(new DataTask("B单位", barrier, service)).start();
		new Thread(new DataTask("C单位", barrier, service)).start();

	}

  2.CountDownLatch --await(等待所有的任务完成),countDown(某一个任务已经完成)-不可重复使用

static class CTask implements Runnable {
		private String name;
		private CountDownLatch countDownLatch;
		
		CTask(String name,CountDownLatch countDownLatch) {
			this.name = name;
			this.countDownLatch = countDownLatch;
		}
		@Override
		public void run() {
			System.out.println("工作者:" + name + "处理任务....");
			countDownLatch.countDown();
		}
		
	}

  

public static void main(String[] args) throws InterruptedException,
			IOException {

		
		final CountDownLatch countDownLatch = new CountDownLatch(3);
		new Thread(new CTask("小云", countDownLatch )).start();
		new Thread(new CTask("小航", countDownLatch )).start();
		new Thread(new CTask("小月", countDownLatch )).start();
		
		countDownLatch.await();
		System.out.println("任务都已完成!!");

	}

  3.exchanger-交换器(分片思想)

public static void main(String[] args) throws InterruptedException,
			IOException {

		final Exchanger exchanger = new Exchanger();
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Thread.currentThread().sleep(1000);
					System.out.println("换出数据:A,换回的数据:" + exchanger.exchange("A") );
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					System.out.println("换出数据:B,换回的数据:" + exchanger.exchange("B") );
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();

	}

  

 

线程实例,布布扣,bubuko.com

线程实例

上一篇:c/c++ 传统数组的缺点


下一篇:Linux Centos虚拟机扩容(/dev/mapper/centos-root)