`
mwei
  • 浏览: 123898 次
  • 性别: Icon_minigender_1
  • 来自: 抽象空间
社区版块
存档分类
最新评论

三线程顺序打印N次ABC

    博客分类:
  • java
阅读更多
记得前一阵子JE上讨论线程顺序打印的面试题,现在有空也练练。
说是,三个线程,其一只打印A,其一只打印B,其一只打印C,要求开启三线程顺序打印多次ABC。
对wait和notify(All)刚刚理解,不能错过这个练习的机会,然后再写个生产者-消费者的程序多练练。写的不好的、需要改进的地方还请JE上的朋友给建议^..^。
public class ThreadABC implements Runnable {   
    public static final int RUN_TOTAL_COUNT=30; //打印ABC的次数
    public static volatile boolean arun=true; //开始打印A
    public static volatile boolean brun=false;
    public static volatile boolean crun=false;   
    public static final byte[] LOCK=new byte[0]; //互斥器
    public void run() {       
        new Thread(new PrintB()).start();
        new Thread(new PrintC()).start();
        new Thread(new PrintA()).start();           
    }
    private static class PrintA implements Runnable{
        private int runCount=0;
        public void run(){       
            synchronized(LOCK){
                while(runCount<RUN_TOTAL_COUNT)
                if(arun){
                    LOCK.notifyAll();
                    System.out.print("A");
                    runCount++;
                    arun=false;
                    brun=true;
                    crun=false;
                }else{
                    try{
                        LOCK.wait();
                    }catch(InterruptedException ie){
                        System.out.println("PrintA InterruptedException occured...");
                    }
                }
            } //end syn
        }
    }
    private static class PrintB implements Runnable{
        private int runCount=0;
        public void run(){           
            synchronized(LOCK){
                while(runCount<RUN_TOTAL_COUNT)
                if(brun){
                    LOCK.notifyAll();
                    System.out.print("B");
                    runCount++;
                    arun=false;
                    brun=false;
                    crun=true;
                }else{
                    try{
                        LOCK.wait();
                    }catch(InterruptedException ie){
                        System.out.println("PrintB InterruptedException occured...");
                    }
                }
            } //end syn
        }
    }
    private static class PrintC implements Runnable{
        private int runCount=0;
        public void run(){           
            synchronized(LOCK){
                while(runCount<RUN_TOTAL_COUNT)
                if(crun){
                    LOCK.notifyAll();
                    System.out.print("C-");
                    runCount++;
                    arun=true;
                    brun=false;
                    crun=false;
                }else{
                    try{
                        LOCK.wait();
                    }catch(InterruptedException ie){
                        System.out.println("PrintC InterruptedException occured...");
                    }
                }
            } //end syn
        }
    }
   
    //test in main
    public static void main(String[] args){
        new Thread(new ThreadABC()).start();
    }
}

-----------------顺序打印A-Z-----------------------------------
public class Print implements Runnable {
	public static final int COUNT=26; //字母的个数
	public static final int TIMES=10; //循环打印的次数
	public static final byte[] LOCK=new byte[0]; //互斥器
	private static volatile int run=0; //每打印一个字母,值会+1
	private List<Printor> printors=new ArrayList<Printor>(); //收集所有线程对象
	
	@Override
	public void run() {
		for(int i=0;i<COUNT;i++){ //初始化26个线程对象
			printors.add(new Printor((char)('A'+i), i));
		}		
		for(int i=printors.size()-1;i>=0;i--){ //逆序:依次运行 
			new Thread(printors.get(i)).start();
		}
	}
	//test in main
	public static void main(String[] args){
		new Thread(new Print()).start();
	}
	
	private static class Printor implements Runnable{
		private char name;
		private int id;
		private int times=0;
		public Printor(char name,int id){
			this.name=name;
			this.id=id;
		}
		@Override
		public void run() {
			synchronized(LOCK){ //把门锁上,别人别想进来
				while(this.times<TIMES)
				if(this.id==run%COUNT){
					System.out.print(this.name);
					if(this.id==COUNT-1) System.out.println(); //换行
					run++;
					this.times++;
					LOCK.notifyAll(); //吼一嗓子:其他的兄弟,你们准备好了吗
				}else {
					try {
						LOCK.wait(); //我K,白来了,我得出去等(释放锁)...
					} catch (InterruptedException e) {
						System.out.println(this.name+"=>exception occurs...");
					}
				}
			} //结束:释放锁
		}
	}
}


分享到:
评论
3 楼 pxlfxl2 2011-04-17  
mwei 写道
pxlfxl2 写道
如果我的需求是要打印A到Z n次呢?那你就得写26个类了

你好,提出的问题很好,我在代码下面追加了另一种方法

哈哈,其实要考虑到扩展还会有其他问题,比如说用户说我不打印abc了,我要打印bca,这时你又得改代码,你可以搜搜,其实还有其他的实现,当然,就这个题目来说,你的代码已经足够了。
2 楼 mwei 2011-03-31  
pxlfxl2 写道
如果我的需求是要打印A到Z n次呢?那你就得写26个类了

你好,提出的问题很好,我在代码下面追加了另一种方法
1 楼 pxlfxl2 2011-03-29  
如果我的需求是要打印A到Z n次呢?那你就得写26个类了

相关推荐

    java课程设计 三线程接力

    在Java课程设计中,"三线程接力"是一个典型的多线程编程问题,它涉及到并发控制、线程间协作以及时间间隔的精确控制。在这个项目中,我们有三个颜色的按钮——红色、蓝色和绿色,它们分别在特定的时间间隔内进行操作...

    三线程分别显示各自时间

    标题提到的"三线程分别显示各自时间"是一个典型的多线程示例,它涉及到如何创建和控制多个线程来按照特定的时间间隔执行任务。下面将详细介绍如何实现这个功能。 首先,我们需要了解Java中的线程基础。在Java中,...

    三线程随机显示26个字母

    在本文中,我们将深入探讨如何使用Java编程语言实现一个三线程系统,该系统能够随机地在界面上显示26个英文字母。这个任务的关键在于理解和应用多线程概念,以及如何同步线程以避免数据竞争和死锁。首先,我们需要...

    PT100三线制电路

    PT100三线制电路

    三线表的制作

    ### 三线表的制作详解 #### 一、三线表概述 三线表是一种简洁、规范的表格形式,常用于学术论文、报告等正式文本中。它由三条线组成:顶部粗线、底部粗线以及中间一条细线。这种表格形式能够清晰地展现数据,避免...

    word一键生成三线表插件

    在Word文档中,三线表是一种常见的表格样式,尤其在学术论文和报告中,它能够清晰地呈现数据,同时保持专业且规范的外观。"word一键生成三线表插件"是一个专门针对这一需求设计的VBA(Visual Basic for Applications...

    股票外汇三线反转指标

    以上提供的是三线反转指标,三线反转是炒股,炒外汇常用的指标。判断趋势使用较为准确,提升交易的准确性!

    三线表的规范格式

    三线表的规范格式,详细介绍三线表的定义、规格、大小以及在word中的格式要求和范例

    三线表VBA.zip

    "三线表VBA.zip"这个压缩包就是为了解决这样的问题而设计的。它包含了一个VBA(Visual Basic for Applications)脚本和一个说明文档,专门针对在Microsoft Word中创建三线表的繁琐过程进行自动化。 三线表是一种...

    三线PT100仿真电路

    【标题】"三线PT100仿真电路"是一个基于Multisim的模拟电路设计,主要目的是通过模拟软件来分析和验证PT100热电阻的三线制测量方法。PT100是一种常见的温度传感器,其电阻值会随着温度的变化而变化,通常在0℃时电阻...

    Piper三线图绘图软件

    Piper三线图是一种在水文地质和环境科学中广泛使用的图形工具,它通过三维坐标系统来直观地展示水体中的离子浓度关系。这个图表由三位科学家——Piper、Plummer和Chapman共同发展,因此得名Piper三线图。在AquaChem...

    张卫星三线开花理论.pdf

    不过,如果【标题】和【描述】中提到的“张卫星三线开花理论.pdf”是指某个具体的IT理论或模式,我需要实际的文档内容才能进行详细的知识点解释。由于这里无法直接查看或解释具体的文档内容,如果您能提供该文档的...

    三线合一证题精精心总结.doc

    通过延长AE和AF交BC于M和N,可以构造出等腰三角形,利用"三线合一",我们可以证明EF是中位线,从而得出EF∥BC。 在证明角相等的问题中,例如在证明∠A=∠B的例1,我们可以作出等腰三角形的顶角平分线,这样根据...

    利用Excel绘制水化学三线图-Piper图

    利用Excel绘制水文地球化学中三线图(Piper图),可充分利用Excel的交互式修改 1、按照已给出的模板,每类型水样,用空行隔开,如实例中井样与泉水样; 2、后点击生成,即可完成 三线图的生成; 3、可给图中离子位置...

    三线程诱鼠器VC源代码

    本示例中的"三线程诱鼠器VC源代码"是一个基于Microsoft Visual C++(VC)和MFC(Microsoft Foundation Classes)框架的项目,它展示了如何设计和实现一个使用三个线程的程序。在本文中,我们将深入探讨三线程程序的...

    顶底三线 三点定乾坤通达信指标公式源码.doc

    顶底三线三点定乾坤通达信指标公式源码分析 在技术分析中,顶底三线三点定乾坤通达信指标公式是一种非常重要的指标,它可以帮助投资者预测股票或期货的涨跌趋势并进行相应的投资决策。这种指标的核心思想是通过画线...

    三线法相机标定

    "三线法相机标定"是一种特殊的标定方法,主要适用于使用三条直线特征的场景。在这个过程中,我们将详细探讨三线法的原理、实现步骤以及在VC2005环境下如何进行。 一、三线法相机标定原理 三线法相机标定基于三个非...

    线性,双线性,三线性插值讲解

    "线性、双线性、三线性插值讲解" 插值是数学领域中的一种数值分析方法,通过已知的离散数据,求未知数据的过程或方法。根据若干离散的数据数据,得到一个连续的函数(也就是曲线)或者更加密集的离散方程与已知数据...

    mt4 kdj三线指标以及安装方法

    "三线KDJ"是KDJ指标的一种变形,增加了更多的参考线,以提供更丰富的交易信号。 KDJ指标,又称为随机指标,由三条曲线组成:K线、D线和J线。它们分别代表快速、慢速和三重随机值。在标准KDJ中,K线是快线,D线是慢...

Global site tag (gtag.js) - Google Analytics