`

有三个线程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,并且顺序要固定住:...

    编程python考试最新试题及答案解析练习.doc

    【编程】python考试最新试题及答案解析练习 一、选择题 1.Python语句 "ab"+"c"*2 的运行结果是( ) A.abc2 B.abcabc C.abcc D.ababcc 2.在python语言中表示"x属于区间[a,b)" 的正确表达式是( ) A.a x or...

    试卷一Python一级考试练习题复习知识点试卷试题.doc

    下面哪个不是Python合法的标识符( ) A.int_3 B.30XL C.self D._abc 4.Python语句 "ab"+"c"*2 的运行结果是( ) A.abc2 B.abcabc C.abcc D.ababcc 5.运行下列 Python程序,结果正确的是( ) a=18 b=7 c=...

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

    一个多线程的题:定义三个线程ID分别为ABC,每个线程打印10遍自己的线程ID,按ABCABC……的顺序进行打印输出。 我的解法: from threading import Thread, Lock # 由_acquire解锁执行后释放_release锁 def _print(_...

    cpp代码-abcabc.cpp

    cpp代码-abcabc.cpp

    【并发编程】 — 线程间的通信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、...

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

    主要介绍了java信号量控制线程打印顺序的示例,如ABCABC这样输出线程,大家参考使用吧

    freemarker总结

    [ {“Akey”:”Avalue”},{“Akey1”:”Avalue1”}, {“Bkey”:”Bvalue”},{“Bkey1”:”Bvalue1”}, ] hashes {“you”:”a”,”me”:”b”,”he”:”c”} 注释标志 这里是注释 --&gt; 旧版本的freemarker采用...

    河南科技大学08级函授计算机应用专业 第三学期 VB作业

    答:(3)28wed 不能作为VB中的变量,在VB中变量名第一个字符必须是英文字母。 3.3 下列符号哪一个是VB中的合法变量名? (1)x23 (2)8xy (3)END (4)X8[B] 答:(1)x23 为合法变量名。 3.8 表达式2*3^2+2*8/4...

    浅析正则表达式中的lastIndex以及预查

    var reg1 = /a/; var reg2 = /a/g; console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true console.log(reg1.test('abcabc')); // true...

    字符替换(C)

    char s[]="ABCABC" s1[]="AC" s2[]="xy" 将s1中字符与s中字符比对 如有相同的九用s2中字符替换

    lfcs_notes

    lfcs_notes 常用表达 特点 定义 例子 结果 ...前面的一个或多个字符 a + bc abc,abc ? 空或前一个字符 a?bc 公元前,abc ^ $ 空字符串 grep并不支持所有正则表达式。作为替代,可以使用egrep

    正则表达式问号的四种用法详解

    string pattern1 = @a.*c; // greedy match Regex regex = new Regex(pattern1); regex.Match(abcabc); // return abcabc 非贪婪匹配 在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配 string pattern1

    ABCabcadbc

    sferfrefwefeqrfrefref

    javaguivirgerene

    txt格式的Encriptado Vigenere。 实施纲领性工作,并在维吉涅尔省的城市历史档案中... 从本质上来说,“ b”本身就是“ a”和“ a”本身就是“”。 由ejemplo,com entreda tenemos la cadena abcABC1,prima parte es

    Netflix-Clone:这是我作为React.js,Redux,Firebase和Stripe集成教程的一部分制作的Netflix克隆

    我会尽快谈谈这个克隆更多的在我的网站。 建于 React.js Redux工具包(针对全局状态) Firebase(用于后端身份验证,存储和托管) 条带集成(用于付款处理) 实时链接和演示 上面的演示中描绘的是本教程提供的...

    卡类销售管理软件

    4.号卡属性管理:普通号,优质号,AA,ABAB,AABB,AAAB,ABC,ABCD,ABCABC 5.号卡状态:在库,已售,已激活,已返点 第二部分:业务流程 1.新卡入库:单个添加与批量添加连续号码 2.销售录入(也称号卡分配、拿货记录)...

    javalruleetcode-LeetCode:力码

    下次如果我们添加一个“a”,如果队列有“bc”,那么可以在最后的字符串中添加“a”,队列将更新为“ca”。 (如果队列中有“abc”,则不能添加“a”,这违反了问题描述) 来自 409:对于那些出现奇数的字符,我们...

Global site tag (gtag.js) - Google Analytics