`
blackbeans
  • 浏览: 140714 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一个按顺序输出的多线程调度示例

阅读更多

  啥叫StepByStep就是一步一步来,让子弹飞中的那句经典台词就是“钱得一点一点赚,步子得一步一步迈,不然咔容易扯着蛋”,说的就是做事情按照一定的规律和顺序来。n个线程,各自执行一段业务逻辑,应业务需求现在需要将这些业务逻辑进行step and step 的完成,带有一定顺序,好比A 线程 输出A, B线程输出B,C线程输出C....现在的要求就是整个业务处理流程就是A-->B-->C 的步骤,晚上模拟了一把。代码见下面:

 

 

package com.blackbeans.example;

import java.util.concurrent.LinkedBlockingQueue;
/**
 * 
 * 一个按顺序输出的多线程调度示例
 * @author blackbeans.zc@gmail.com
 *
 */
public class SequentialOutputDemo {
	
	 public static void main(String[] args) {
		 
		 /**
		  * 使用队列来构造、保证业务调用的顺序,
		  * 想法是所有线程从这个队列头部取出令牌,
		  * 如果这个令牌不属于自己线程管辖范围,则不予理睬
		  * 如果这个令牌属于自己线程管辖的范围,那么
		  * 1.执行业务操作
		  * 2.取出对猎头部令牌并将该令牌插入队尾,来构成环形顺序,这一步一定要保证原子
		  */
		 final LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(8);
		 queue.offer(0);
		 queue.offer(1);
		 queue.offer(2);
		 
		 //控制调用次数
		 final int count = 1000;
		 new Thread(new Runnable() {
			@Override
			public void run() {
				int i=0;
				while(i<count){
					
					/**
					 * 检测队首的元素是否为当前线程需要
					 */
					int index = queue.peek();
					if(index == 0){
						System.out.print("A\t");
						/**
						 * 取出队首的令牌并保证原子性插入队尾
						 */
						pollAndOffer(queue);
						i++;
					}
				}
			}
		}).start();
		 
		 new Thread(new Runnable() {
				@Override
				public void run() {
					int i=0;
					while(i<count){
						int index = queue.peek();
						if(index == 1){
							System.out.print("B\t");
							pollAndOffer(queue);
							i++;
						}
					}
				}
			}).start();
		 
		 new Thread(new Runnable() {
				@Override
				public void run() {
					int i=0;
					while(i<count){
						int index = queue.peek();
						if(index == 2){
							System.out.print("C\n");
							pollAndOffer(queue);
							i++;
						}
					}
				}
			}).start();
	 }
	 
	 private static void pollAndOffer(LinkedBlockingQueue<Integer> queue){
		 synchronized (queue) {
			 queue.offer(queue.poll());
		 }
	 }

}
分享到:
评论

相关推荐

    python 进程的使用 python基础 提供了python进程的使用示例代码,python2可以直接运行

    python 进程的使用 python基础 提供了...5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。

    Java开发技术大全(500个源代码).

    lozengeStar.java 输出一个由*组成的菱形 multiplyTable.java 求乘法口诀表 narrowingConversion_1.java 缩减转换引发错误示例1 narrowingConversion_2.java 缩减转换引发错误示例2 notMultipleOfThree.java 把...

    Threading-Examples-:用于调度线程的 Java 代码

    Sample01- 调度线程的 Java 代码 - 调度一个线程,使线程 t1,t2,t3 始终按顺序执行 Sample02- Java 线程代码来计算偶数 Sample03 - 解释线程 join() 的 Java 线程示例 Sample03 - 解释线程 yeild() 的 Java 线程示例...

    Java范例开发大全 (源程序)

     实例56 按相反的顺序输出 79  实例57 奇偶分组 80  实例58 找宝 81  实例59 寻找最小数 82  实例60 我的位置在哪里 83  实例61 复制数组 85  实例62 插入新元素 86  实例63 数组的合并 87  实例64...

    java-concurrency-in-practice:Brian Goetz的“实践中的Java并发性”一书中的注释和示例

    线程允许程序控制流的多个流在一个进程中共存。 它们共享进程范围的资源,例如内存和文件句柄,但是每个线程都有自己的程序计数器,堆栈和局部变量。 可以在多个CPU上同时调度同一程序中的多个线程。 线程有时...

    java范例开发大全(pdf&源码)

    实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 实例65 ...

    java范例开发大全源代码

     实例128 多个小文件合成一个文件 181  实例129 统计指定文件中的字符个数 183  实例130 对象的序列化与反序列化 185  实例131 同时显示多个文件 187  实例132 生成zip压缩文件 189  实例133 解压缩...

    java范例开发大全

    实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 实例65 ...

    JAVA基础课程讲义

    一个典型的JAVA程序的编写和运行过程 19 第一个程序常见错误 20 第一个JAVA程序的总结和提升 20 常用Java开发工具 20 常用dos命令 21 本章笔试作业 21 本章上机操作 21 第二章(1) 编程的基本概念 22 注释 22 标识符 ...

    Java范例开发大全(全书源程序)

    实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 ...

    static 用法

    下面针对示例程序二, 分析在多线程情况下的不安全性.(为方便描述, 标上行号) ① const char * IpToStr(UINT32 IpAddr) ② { ③ static char strBuff[16]; // static局部变量, 用于返回地址有效 ④ const ...

    Oracle9i的init.ora参数中文说明

    说明 : 指定在一个共享服务器环境中可同时运行的调度程序进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 如果已配置了调度程序, 则默认值为大于 5 的任何数目或配置的调度程序的数目 mts_max_servers: ...

    X-Scan v3.1

    采用多线程方式对指定IP地址段(或单机)进行安全漏洞检测,支持插件功能,提供了图形界面和命令行两种操作方式,扫描内容包括:远程服务类型、操作系统类型及版本,各种弱口令漏洞、后门、应用服务漏洞、网络设备...

    java基础案例与开发详解案例源码全

    2.3.3 开发Java第一个程序21 2.3.4 Java代码中的注释23 2.3.5 常见错误解析24 2.4 Java类库组织结构和文档27 2.5 Java虚拟机简介28 2.6 Java技术两种核心运行机制29 2.7 上机练习30 第3章 3.1 变量32 3.1.1 什么是...

    X-Scan

    功能简介: &lt;br&gt; 采用多线程方式对指定IP地址段(或单机)进行安全漏洞检测,支持插件功能,提供了图形界面和命令行两种操作方式,扫描内容包括:远程服务类型、操作系统类型及版本,各种弱口令漏洞、后门、应用...

    javaSE代码实例

    1.4 第一个Java程序 8 1.4.1 开发源代码 8 1.4.2 编译运行 9 1.5 小结 11 第2章 基本数据类型——构建Java 大厦的基础 12 2.1 源代码注释 12 2.1.1 单行注释 12 2.1.2 区域注释 12 2.1.3 文档...

    嵌入式课件

    1.2.4 信息存储的字节顺序 1.3 嵌入式微处理器的结构和类型 1.3.1 嵌入式微控制器 1.3.2 嵌入式微处理器 1.3.3 嵌入式DSP处理器 1.3.4 嵌入式片上系统 1.3.5 多核处理器 思考题与习题 第2章 ARM体系结构 2.1 ARM...

Global site tag (gtag.js) - Google Analytics