`
blackbeans
  • 浏览: 141637 次
  • 性别: 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());
		 }
	 }

}
分享到:
评论

相关推荐

    多线程编程示例

    多线程是指在一个进程中同时执行多个独立的执行线程。在单核CPU系统中,操作系统通过时间片轮转的方式在不同线程之间切换,营造出并发执行的假象;而在多核或多处理器系统中,线程可以真正地并行运行,提高系统的...

    多线程优先级示例_赛马

    在多线程的"赛马"示例中,我们可以模拟一场赛马比赛,每匹马代表一个线程,它们各自具有不同的优先级。比赛的目的是让优先级高的马先到达终点,以此来展示优先级在多线程环境中的影响。这个例子可以帮助我们理解线程...

    delphi多线程精品示例

    总的来说,"delphi多线程精品示例"是一个宝贵的学习资源,它可以帮助开发者深入了解和实践Delphi中的多线程编程,提升应用程序的并发性能和用户体验。通过深入研究这些代码,你可以更好地掌握多线程编程的关键技术和...

    DSP/BIOS的多线程调度

    本文将深入探讨DSP/BIOS的多线程调度原理,以及如何利用其中的通信模块如Semaphore(信号量)、Message Box(消息队列)等实现多任务的合理调度和资源分配。 首先,多线程调度是DSP/BIOS的核心功能之一,它确保了...

    java 多线程示例

    本示例旨在为初学者提供一个全面理解Java多线程的起点。通过学习这个实例,你可以掌握如何创建和管理线程,理解线程同步与通信的重要性,以及如何处理线程安全问题。 1. **线程的创建** Java提供了两种创建线程的...

    java多线程示例

    但优先级并不保证绝对的执行顺序,因为线程调度主要由操作系统决定。 七、守护线程(Daemon) 守护线程在所有非守护线程结束时自动终止,通常用于后台服务,如垃圾收集器。 通过以上知识点,我们可以更好地理解和...

    C#-多线程排序示例

    本文将深入探讨如何在C#中实现多线程排序,并提供一个适用于初学者的学习示例。 首先,理解多线程的概念至关重要。多线程是指在一个应用程序中同时运行多个独立的执行路径,每个路径称为一个线程。在C#中,我们可以...

    线程调度模拟电梯

    本项目“线程调度模拟电梯”是一个教学示例,旨在帮助学生理解线程调度的基本原理及其在实际问题中的应用。我们将通过分析电梯模拟程序来探讨相关知识点。 1. **线程的概念**: 在多任务环境下,线程是程序的执行...

    java多线程应用实现示例

    本示例着重探讨如何在Java中实现多线程,并通过一个具体的小球运动模拟来阐述相关概念。 一、多线程基础 多线程是指在一个进程中可以存在多个并发执行的线程。Java提供了两种方式创建线程:继承Thread类或实现...

    线程调度的优先级

    线程调度是多任务操作系统中的一个关键概念,它决定了如何在多个并发运行的线程之间分配CPU的时间片。线程调度的优先级是决定哪些线程应该先获得执行权的重要因素,尤其对于Java这样的多线程编程环境。下面将详细...

    多线程研究报告_多线程示例_

    4. 线程调度:操作系统需要管理线程的执行顺序,调度不当可能导致效率低下。 四、多线程的实现 1. 系统级线程:由操作系统直接支持,如Java中的Thread类或C++的std::thread库。 2. 用户级线程:完全由应用程序管理...

    VS 2005 多线程编程示例

    在本示例中,我们将探讨如何在VS 2005中利用C#进行多线程操作。 首先,让我们了解什么是线程。线程是程序执行的最小单位,每个进程至少包含一个线程。在单线程程序中,所有的任务都在同一线程上顺序执行。而在多...

    VC++ 线程优先级 示例程序

    在编程领域,线程是操作系统分配CPU执行时间的基本单元,多线程技术使得程序能够同时执行多个任务。...通过“赛马”示例程序,开发者能直观理解线程优先级对程序执行顺序的影响,从而更好地设计和优化多线程应用。

    关于c#多线程示例

    在C#编程中,多线程是一个核心概念,它允许应用程序同时执行多个任务,从而提高程序的并发性和效率。在现代计算机系统中,多核处理器的普及使得多线程技术变得尤为重要。本示例将深入探讨C#中的多线程实现方法、应用...

    多线程优先级的示例演示

    标题中的“多线程优先级的示例演示”是一个实践教程,旨在帮助开发者理解线程优先级的工作原理以及如何在实际代码中应用。通过模拟赛马比赛的场景,我们可以直观地看到不同优先级的线程如何在运行时相互竞争和协作。...

    Qt 多线程及简单实例 demo

    1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对代码的细微修改都可能产生意想不到的效果。 先由一...

    iOS多线程示例

    临界区是多线程编程中的一个关键概念,用于保护共享资源免受并发访问的影响。在iOS中,可以使用`@synchronized`关键字或者GCD的`dispatch_semaphore_t`信号量来控制对共享资源的访问,防止竞态条件的发生。 资源池...

    c#多线程顺序打印1-100数字-源码.rar

    本资源"ConsoleApp1"是一个C#实现的多线程示例,它演示了如何在多线程环境中顺序打印1到100的数字。在多线程环境下实现顺序打印看似简单,实则涉及到线程同步和控制的问题,这通常通过各种同步原语来实现。在这个...

    C#的多线程示例;几个多线程之间的互斥,同步;WPF主界面INVOKE

    多线程是指一个应用程序内同时运行多个独立的执行线程。在C#中,可以使用`System.Threading`命名空间中的`Thread`类创建和管理线程。通过开启新线程,我们可以让CPU在处理一项任务的同时进行其他任务,提高程序的...

Global site tag (gtag.js) - Google Analytics