一个按顺序输出的多线程调度示范
一个按顺序输出的多线程调度示例
啥叫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()); } } }