`

有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC.

    博客分类:
  • java
阅读更多
   网上一个有意思的题目:
    有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印10次ABCABC.
    以下是我的实现方式:
  
 public class Main {
	public static void main(String[] args){
		Data data=new Data();
		new ThreadA("A",data).start();
		new ThreadB("B",data).start();
		new ThreadC("C",data).start();
	}
}


public class ThreadA extends Thread{
	private Data data;
	public ThreadA(String name,Data data){
		super(name);
		this.data=data;
	}
	public void run(){
		try{
			for(int i=0;i<10;i++){
				data.writeA();
				Thread.sleep(1000);
			}
		}catch(InterruptedException e){
			
		}
	}
}


public class ThreadB extends Thread{
	private Data data;
	public ThreadB(String name,Data data){
		super(name);
		this.data=data;
	}
	public void run(){
		try{
			for(int i=0;i<10;i++){
				data.writeB();
				Thread.sleep(1000);
			}
		}catch(InterruptedException e){
			
		}
	}
}


public class ThreadC extends Thread{
	private Data data;
	public ThreadC(String name,Data data){
		super(name);
		this.data=data;
	}	
	
	public void run(){
		try{
			for(int i=0;i<10;i++){
				data.writeC();
				Thread.sleep(1000);
			}
		}catch(InterruptedException e){
			
		}
	}
}


public class Data {
	private DataBlock block=new DataBlock();
	
	public void writeA()throws InterruptedException{
			block.lockA();
			try{
				System.out.print("A");
			}finally{
				block.unlockA();
			}
	}
	
	public void writeB()throws InterruptedException{
		block.lockB();
		try{
			System.out.print("B");
		}finally{
			block.unlockB();
		}
}
	
	public void writeC()throws InterruptedException{
		block.lockC();
		try{
			System.out.print("C");
		}finally{
			block.unlockC();
		}
}
}


package com.thread.xunlei;

public class DataBlock {
	private int flag=1;
	
	public synchronized void lockA() throws InterruptedException{
		while( flag!=1 ){
			wait();
		}
	}
	
	public synchronized void unlockA(){
		flag=2;
		notifyAll();
	}
	
	public synchronized void lockB() throws InterruptedException{
		while( flag!=2 ){
			wait();
		}
	}
	
	public synchronized void unlockB(){
		flag=3;
		notifyAll();
	}
	
	public synchronized void lockC() throws InterruptedException{
		while( flag!=3 ){
			wait();
		}
	}
	
	public synchronized void unlockC(){
		flag=1;
		notifyAll();
	}
}
分享到:
评论

相关推荐

    <一>、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软件编程等级考试(二级)编程实操题.pdf

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

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

    16. 字符串`a="python"`,切片`a[1:3]`将获取第二个和第三个字符,即`'py'`。 17. 可以作为Python变量名的有字母、数字和下划线组成,且不能以数字开头,例如D `ababcc`。 18. 运行结果正确的Python程序未给出,...

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

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

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

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

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

    6. **数组访问**:在C语言中,数组下标从0开始,因此`a[2]`代表第三个元素,输出结果为3。 7. **字符串连接**:`strcat`函数用于连接两个字符串,所以`strcat(p1, p2)`会将"ABC"添加到"abc"后面,输出结果为"abcABC...

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

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

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

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

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

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

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

    1. 问题中的位运算部分,`B=((x&0xff)&&(z&gt;′a′))`,`x&0xff`是为了取x的低8位,因为`0xff`是二进制11111111,与运算后得到x的十进制值40的低8位,即40。`z&gt;′a′`检查字符z是否大于'a'。如果z是'B',那么条件为真...

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

    【编程NCT等级测试-Python编程二级真题测试卷2word练习.pdf】这份文档是针对Python编程二级考试的真题练习,旨在帮助学习者检验和提升自己的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语言中,逻辑与(&&)操作符需要两边的...

    cpp代码-abcabc.cpp

    在给定的信息中,我们可以看到一个与C++编程相关的压缩包文件,命名为"cpp代码-abcabc.cpp"。这个文件可能包含了一个C++源代码文件和一个附加的文本文件。让我们详细探讨一下C++编程的一些核心知识点,以及这些文件...

    软通python机试考题总结.docx

    15. “ab”+”c”*2 结果是:():B abcabc 解释:在 Python 中,字符串的加法和乘法操作可以将字符串连接起来。 16. 以下会出现错误的是():A ‘北京'.encode() 解释:在 Python 中,字符串的 encode() ...

    七年级数学上册1.2.4绝对值-化简绝对值填空题专项练习二(人教版,含解析).pdf

    9. 第九题中,|a|+|b|+|a+b|+|b﹣ a|的结果取决于a和b在数轴上的相对位置,这里未给出具体图形,但一般情况会有四种可能的结果,需要具体情况具体分析。 10. 第十题中,根据数轴位置化简表达式,得到-a+3-2(-a-1)。 ...

    算法文档无代码浅析“最小表示法”思想在字符串循环同构问题中的应用

    标题中提到的“最小表示法”是一种解决字符串问题的算法思想,特别是在处理字符串循环同构问题时非常有用。在深入了解之前,我们首先要明白几个基本概念。 字符串循环同构是指一个字符串可以被看作是另一个字符串的...

Global site tag (gtag.js) - Google Analytics