啥叫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基础 提供了...5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。
lozengeStar.java 输出一个由*组成的菱形 multiplyTable.java 求乘法口诀表 narrowingConversion_1.java 缩减转换引发错误示例1 narrowingConversion_2.java 缩减转换引发错误示例2 notMultipleOfThree.java 把...
Sample01- 调度线程的 Java 代码 - 调度一个线程,使线程 t1,t2,t3 始终按顺序执行 Sample02- Java 线程代码来计算偶数 Sample03 - 解释线程 join() 的 Java 线程示例 Sample03 - 解释线程 yeild() 的 Java 线程示例...
实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64...
线程允许程序控制流的多个流在一个进程中共存。 它们共享进程范围的资源,例如内存和文件句柄,但是每个线程都有自己的程序计数器,堆栈和局部变量。 可以在多个CPU上同时调度同一程序中的多个线程。 线程有时...
实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 实例65 ...
实例128 多个小文件合成一个文件 181 实例129 统计指定文件中的字符个数 183 实例130 对象的序列化与反序列化 185 实例131 同时显示多个文件 187 实例132 生成zip压缩文件 189 实例133 解压缩...
实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 实例65 ...
一个典型的JAVA程序的编写和运行过程 19 第一个程序常见错误 20 第一个JAVA程序的总结和提升 20 常用Java开发工具 20 常用dos命令 21 本章笔试作业 21 本章上机操作 21 第二章(1) 编程的基本概念 22 注释 22 标识符 ...
实例56 按相反的顺序输出 79 实例57 奇偶分组 80 实例58 找宝 81 实例59 寻找最小数 82 实例60 我的位置在哪里 83 实例61 复制数组 85 实例62 插入新元素 86 实例63 数组的合并 87 实例64 去除重复元素 88 ...
下面针对示例程序二, 分析在多线程情况下的不安全性.(为方便描述, 标上行号) ① const char * IpToStr(UINT32 IpAddr) ② { ③ static char strBuff[16]; // static局部变量, 用于返回地址有效 ④ const ...
说明 : 指定在一个共享服务器环境中可同时运行的调度程序进程的最大数量。 值范围: 根据操作系统而定。 默认值 : 如果已配置了调度程序, 则默认值为大于 5 的任何数目或配置的调度程序的数目 mts_max_servers: ...
采用多线程方式对指定IP地址段(或单机)进行安全漏洞检测,支持插件功能,提供了图形界面和命令行两种操作方式,扫描内容包括:远程服务类型、操作系统类型及版本,各种弱口令漏洞、后门、应用服务漏洞、网络设备...
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 什么是...
功能简介: <br> 采用多线程方式对指定IP地址段(或单机)进行安全漏洞检测,支持插件功能,提供了图形界面和命令行两种操作方式,扫描内容包括:远程服务类型、操作系统类型及版本,各种弱口令漏洞、后门、应用...
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...