线程实例

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

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

时间: 2024-11-01 16:39:39

线程实例的相关文章

C# 简单线程实例

1.简单线程实例 以及委托(同步委托.异步委托) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Runtime.Remoting.Messaging; namespace ThreadTest { class Program { static void Main(string[] args) { C

C# 线程--第四线程实例

概述 在前面几节中和大家分享了线程的一些基础使用方法,本章结合之前的分享来编写一些日常开发中应用实例,和编写多线程时一些注意点.如大家有好的实例也欢迎分享.. 应用实例 应用:定时任务程序 场景:系统中常常会有一些需要定时去循环执行的存储过程或方法等,这时就出现了定时任务小程序. 模型:查询需定时执行的计划任务-->插入线程池-->执行任务 static void MainMethod() { Thread thead; thead = new Thread(QueryTask); thead

Java 线程实例 刷碗烧水和倒计时

线程——烧水刷碗和倒计时实例 (一)烧水刷碗 刷碗的同时烧水:下面是碗的程序: 下面是烧水的程序:在水的实现类中,调用了Thread线程,让烧水刷碗同时进行. 注意:刷碗2s一次,烧水10s (二)10S倒计时 (三)内部类 原文地址:https://www.cnblogs.com/fengyongzhi/p/10818930.html

CountDownLatch线程阻塞用法实例

在编写多线程的工作中,有个常见的问题:主线程(main) 启动好几个子线程(task)来完成并发任务,主线程要等待所有的子线程完成之后才继续执行main的其它任务. 默认主线程退出时其它子线程不会停,如果想让main退出时其它子线程终止,可以用subThread.setDaemon(true) 设置子线程为“守护线程”. 如果要在主线程等待所有子线程完成后,还要执行其它操作(比如:结果合并).可以用join()方法来等待所有子线程完成后,才继续执行.如下: 实例1:Join实现 public c

day9---多线程,线程锁,队列

进程.线程http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 使用threading模块实现多线程编程[综述]Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势. 在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threa

Python自动化开发,Day10 - 进程、线程、协程

本章内容 操作系统发展史介绍 进程与线程的区别 python GIL全局解释器锁 线程 语法 join 线程锁Lock\Rlock\信号量 将线程变为守护进程 Event时间 Queue队列 生产者消费者模型 进程 语法 进程间通讯 进程池 一.操作系统发展史介绍 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存

Python--day9--进程/线程/协程

 介绍 学习记录 2016年12月29日 19:36:23 目录: 进程/线程基础概念 GIL Join  &  Daemon 线程锁 RLock递归锁 信号量 Event Queques 进程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程是程序的一次执行活动,属于动态概念. 线程 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.

多线程编程(进程和线程)

多线程编程(进程和线程) 1.进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程可以启动多个线程. 2.线程:指程序中一个执行流程,一个进程中可以运行多个线程. 一.创建线程(两种方式) 二.线程的5种状态( New,Runnable,Running,Block,Dead ): 三.线程的优先级 四.守护线程 /精灵线程/后台线程 五.方法 六.同步代码锁(synchronized) 一.创建线程(两种方式): 方式1:采用继承Thread的方法 第一,继承 Thre

Java多线程-新特性-线程池

Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序,线程部分的新增内容显得尤为重要. 有关Java5线程新特征的内容全部在java.util.concurrent下面,里面包含数目众多的接口和类,熟悉这部分API特征是一项艰难的学习过程.目前有关这方面的资料和书籍都少之又少,大部分介绍线程方面书籍还停留在java5之前的知识层面上. 在Java5之