`
mnbwz
  • 浏览: 7721 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC…

阅读更多

题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次ABCABC…
方法一:使用wait()、notify()控制打印次序

public class Test {
    public static Object a = new Object();
    public static Object b = new Object();
    public static Object c = new Object();

    public class Runner1 implements Runnable {
		public void run() {
		    for (int i = 0; i < 10; i++) {
				try {
				    synchronized (a) {
						// System.out.println("a is locked by t1");
						synchronized (b) {
						    // System.out.println("b is locked by t1");
						    System.out.print("A");
						    b.notify();
						    // System.out.println("t1 notify b");
						}
						if (i < 9) {
						    a.wait();
						}
				    }
				} catch (InterruptedException e) {
				    e.printStackTrace();
				}
		    }
		}
    }

    public class Runner2 implements Runnable {
		public void run() {
		    for (int i = 0; i < 10; i++) {
				try {
				    synchronized (b) {
						// System.out.println("b is locked by t2");
						synchronized (c) {
						    // System.out.println("c is locked by t2");
						    System.out.print("B");
						    c.notify();
						    // System.out.println("t2 notify c");
						}
						if (i < 9) {
						    b.wait();
						}
				    }
				} catch (InterruptedException e) {
				    e.printStackTrace();
				}
		    }
		}
    }

    public class Runner3 implements Runnable {
		public void run() {
		    for (int i = 0; i < 10; i++) {
				try {
				    synchronized (c) {
						// System.out.println("c is locked by t3");
						synchronized (a) {
						    // System.out.println("a is locked by t3");
						    System.out.print("C");
						    a.notify();
						    // System.out.println("t3 notify a");
						}
						if (i < 9) {
						    c.wait();
						}
				    }
				} catch (InterruptedException e) {
				    e.printStackTrace();
				}
		    }
		}
    }

    public static void main(String[] args) {
		Test t = new Test();
		Thread t1 = new Thread(t.new Runner1(), "t1");
		Thread t2 = new Thread(t.new Runner2(), "t2");
		Thread t3 = new Thread(t.new Runner3(), "t3");
		t1.start();
		try {
		    Thread.sleep(1);
		} catch (InterruptedException e1) {
		    e1.printStackTrace();
		}
		t2.start();
		try {
		    Thread.sleep(1);
		} catch (InterruptedException e) {
		    e.printStackTrace();
		}
		t3.start();
    }
}

 

方法二:使用管道流在进程间传递消息控制打印次序

import java.io.*;
class RunnerA implements Runnable{
	DataInputStream disA=null;
	DataOutputStream dosA=null;
	public RunnerA(PipedInputStream pisA,PipedOutputStream posA){
		disA=new DataInputStream(pisA);
		dosA=new DataOutputStream(posA);
	}
	public void run(){
		try{
			for(int i=0;i<10;i++){
				if(i==0){
					System.out.print("A");
					dosA.writeChar('A');
				}else if(i==9){
					char c=disA.readChar();
					System.out.print("A");
					dosA.writeChar('O');
				}else{
					char c=disA.readChar();
					System.out.print("A");
					dosA.writeChar('A');
				}
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
class RunnerB implements Runnable{
	DataInputStream disB=null;
	DataOutputStream dosB=null;
	public RunnerB(PipedInputStream pisB,PipedOutputStream posB){
		disB=new DataInputStream(pisB);
		dosB=new DataOutputStream(posB);
	}
	public void run(){
		try{
			char c=disB.readChar();
			while(true){
				if(c=='O'){
					System.out.print("B");
					dosB.writeChar('O');
					break;
				}
				if(c=='A'){
					System.out.print("B");
					dosB.writeChar('B');
					c=disB.readChar();
				}
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
class RunnerC implements Runnable{
	DataInputStream disC=null;
	DataOutputStream dosC=null;
	public RunnerC(PipedInputStream pisC,PipedOutputStream posC){
		disC=new DataInputStream(pisC);
		dosC=new DataOutputStream(posC);
	}
	public void run(){
		try{
			char c=disC.readChar();
			while(true){
				if(c=='O'){
					System.out.print("C");
					break;
				}
				if(c=='B'){
					System.out.print("C");
					dosC.writeChar('C');
					c=disC.readChar();
				}
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
public class Test{
	public static void main(String[] args){
		PipedOutputStream posA=new PipedOutputStream();
		PipedInputStream pisA=new PipedInputStream();
		PipedOutputStream posB=new PipedOutputStream();
		PipedInputStream pisB=new PipedInputStream();
		PipedOutputStream posC=new PipedOutputStream();
		PipedInputStream pisC=new PipedInputStream();
		try{
			pisA.connect(posC);
			pisB.connect(posA);
			pisC.connect(posB);
		}catch(IOException e){
			e.printStackTrace();
		}
		
		Thread ta=new Thread(new RunnerA(pisA,posA),"ta");
		Thread tb=new Thread(new RunnerB(pisB,posB),"tb");
		Thread tc=new Thread(new RunnerC(pisC,posC),"tc");
		
		ta.start();
		tb.start();
		tc.start();
	}  
}

 

0
0
分享到:
评论

相关推荐

    <一>、C++实现多线程的同步处理:控制ABC的输出顺序,输出10组,mutex+condition-variable源码示例

     有三条线程,可以分别输出A、B、C字符,现想办法控制输出顺序,使得顺序为ABCABC......ABC[共10组],并且每条线程只能启动一次,不能多次启动。 通过一个标志位来处理的方式虽然可以实现效果,但是还不够安全,极...

    <二>、C++实现多线程的同步处理:控制ABC的输出顺序,输出10组,mutex+condition-variable源码示例

    有三条线程,可以分别输出A、B、C字符,现想办法控制输出顺序,使得顺序为ABCABC......ABC[共10组],并且每条线程只能启动一次,不能多次启动。 需要3条线程输出不同的字符,分别为A、B、C,并且顺序要固定住:...

    浅谈Python3多线程之间的执行顺序问题

    在Python3中,多线程编程允许我们同时执行多个任务,但线程的执行顺序并不是预先确定的,而是由操作系统的线程调度器决定。在给出的标题和描述中,提出了一个具体的问题:如何控制三个线程按照特定的顺序(ABCABC…...

    java信号量控制线程打印顺序的示例分享

    在这个示例中,信号量被用来控制三个线程(A、B、C)按照特定顺序(ABCABC...)打印字符。以下是关于Java信号量及其在示例中的应用的详细解释: 1. **什么是信号量?** 信号量是一个计数器,可以理解为一种许可证...

    《Python语言及应用》期末试卷(B)含答案.doc

    《Python语言及应用》期末试卷(B)涵盖了Python编程的基础知识,包括语法、数据类型、运算符、内存管理、程序执行方式、语句块的标记、算法概念、Python特性以及面向对象编程的基本概念。以下是根据试卷内容展开的...

    C语言概念题解答选编及答案

    - **问题**:给出两个布尔变量m和n,其中m = a &gt; b && n = a &gt; b,如果a和b的值分别为1和2,那么m和n的值是什么? - **答案**:由于a不大于b,所以m和n的值均为0(假)。在C语言中,逻辑与(&&)操作符需要两边的...

    软通python机试考题总结.docx

    10. 计算机中信息处理和信息储存用():A 二进制代码 解释:在计算机中,信息处理和信息储存通常使用二进制代码。 11. python 源程序执行的方式():B 解析执行 解释:在 Python 中,源程序执行的方式是解析...

    资料python软件编程等级考试(二级)编程实操题.pdf

    9. **字符串操作**:Python中的字符串连接可以使用`+`,所以 `ab"+"c"*2`的结果是 `abcabc`,选项B正确。 10. **Python数据类型**:Python支持的数据类型中没有`char`,选项A错误。 11. **条件分支**:在给定的...

    NCT等级测试-Python编程一级真题测试卷1图文练习.pdf

    20. **print命令**:`print()`用于在屏幕中输出文本或数字,可以输出多个值,用逗号分隔。 21. **原始字符串**:以`r`或`R`开头的字符串表示原始字符串,不会转义`\n`,所以输出结果是`\nGood`。 22. **源代码类型...

    资料全国青少年软件编程(Python)等级考试试卷(三级)2word练习.docx

    - 程序中涉及了求解二次方程的根,`(-b+math.sqrt(d))/(2*a)` 是一个根,另一个根是 `(-b-math.sqrt(d))/(2*a)`。 - 在Python中,输入数据通常使用 `input()` 函数,而 `void` 不是Python的关键字。 10. Pandas库...

    2022年高等教育自学考试计算机基础与程序设计试题.doc

    10. **数据输入**:在C语言中,使用`scanf`函数输入数据,正确的格式是`scanf("%d,%d", &a, &b)`,所以正确的输入是2,3(回车)。 11. **条件运算符**:`y=x&gt;12?x+10:x-12;`表示如果x大于12,则y=x+10,否则y=x-12...

    【并发编程】 — 线程间的通信wait、notify、notifyAll

    三个线程顺序打印问题2.1.1 题目2.1.2 题目分析2.1.3 我的答案2.2 生产者消费者问题2.2.1 题目2.2.2 题目分析2.2.3 我的答案 源码地址:https://github.com/nieandsun/concurrent-study.git 1 wait、notify、...

    程序员求职应聘必读pdf

    在这个例子中,`hanoi`函数代表了汉诺塔问题的基本移动步骤,参数分别代表盘子的数量以及三个柱子的标识。不同的参数组合代表了不同的移动顺序,用于解决不同情况下的汉诺塔问题。 以上几个知识点都是程序员在求职...

    试题python基础试题(含答案)练习.pdf

    【Python基础试题解析】 1. 在Python中,变量名不能以数字开头,因此选项B `3...以上是对题目中部分Python基础知识的详细解释,涵盖了变量命名规则、数据类型、运算符、字符串操作、循环、条件判断、函数等多个方面。

    C语言基础考试题及答案3

    14. `fopen`函数的"r+"模式允许读写操作,因此在打开文件时使用"r+"可以实现读写。 以上就是C语言基础考试题的相关知识点详解,涵盖了位运算、函数、指针、字符串、结构体、文件操作等多个方面。学习C语言时,这些...

    NCT全国青少年编程能力等级测试python二级优质word练习.pdf

    15. **Python变量赋值**:在Python中,`a=b`表示将`b`的值赋给`a`,而不是交换两个变量的值。 16. **应用软件**:Python不在应用软件的范畴内,它是一种编程语言,而Word、微信和考试系统都是应用软件的例子。 17....

    届高三数学余弦定理PPT课件.pptx

    在解题过程中,如果已知两边a、b和一个角A,通常会先利用余弦定理求出第三个角B,然后用正弦定理求出边c。例如,如果已知a、b和A,求解三角形的步骤如下: 1. 利用cosB = (a² + c² - b²) / (2ac)求出cosB,从而...

    试卷python软件编程等级考试(三级)编程实操题02练习.pdf

    print(a,b)`执行后,`a`和`b`的值分别是`3`和`2`。 【Python输出函数】 在Python中,`print()`函数用于输出内容。 【Python控制结构】 多分支选择结构在Python中通常通过`if-elif-else`实现。示例代码`if-else`...

    C语言基础算法

    C语言是一种通用的高级编程语言,因其高效性和灵活性被广泛应用于各种系统软件和应用软件的开发中,特别是在底层开发领域有着不可替代的地位。C语言的设计目标是使得程序员能够用简单明了的方式编写代码,同时还能...

    编程NCT等级测试-Python编程二级真题测试卷2word练习.pdf

    【编程NCT等级测试-Python编程二级真题测试卷2word练习.pdf】这份文档是针对Python编程二级考试的真题练习,旨在帮助学习者检验和提升自己的Python编程能力。Python是一种高级编程语言,以其简洁易读的语法和广泛的...

Global site tag (gtag.js) - Google Analytics