关闭

一道面试题:三个线程循环有序输出10次ABCABC...

186人阅读 评论(0) 收藏 举报

面试遇到的一道面试题:三个线程循环有序输出10次ABCABC...

解决思路:使用synchronized,wait和notifyAll控制线程同步


package com.myj.test.thread;
/**
 * 三个线程循环打印ABC10次
 * 
 * 通过给实现Runnable接口的类添加一个私有变量,该变量就是每一个运行该任务线程的标识,
 * 只有当线程的标识与Letter的私有变量一致才会运行输出,否则将阻塞,
 * 直到其他线程将其唤醒,并在阻塞的位置继续执行,即再判断标识和letter的值
 * 
 * letter的值也是需要改变的,每次线程输出完之后,要将该值更改为下一个
 * 
 *
 */
public class ABC {
	public static void main(String[] args) {
		
		ABC t = new ABC();
		Letter l = t.new Letter();
		new Thread(t.new Mission(l, 'A')).start();
		new Thread(t.new Mission(l, 'B')).start();
		new Thread(t.new Mission(l, 'C')).start();
		
	}
	
	
	class Letter{
		private char letter = 'A';
		
		public void show(){
			System.out.println(letter);
			
		}
		
		public void nextLetter(char letter){
			switch(letter){
			case 'A':
				this.letter = 'B';
				break;
			case 'B':
				this.letter = 'C';
				break;
			case 'C':
				this.letter = 'A';
				break;
			}
		}
		
		public char getLetter(){
			return this.letter;
		}
		
		
	}
	
	
	
	class Mission implements Runnable{

		private Letter letter;
		//线程的标识
		private char let;
		
		public Mission(Letter letter, char let){
			this.letter = letter;
			this.let = let;
		}
		
		@Override
		public void run() {
			
			for(int i=0;i<10;i++){
				
				synchronized(letter){
					//运行的线程标识如果和letter的值不一样就先使该线程阻塞
					//直到运行的线程标识和letter值一致
					while(let!=letter.getLetter()){
						try {
							//进入阻塞,直到其他线程调用notifyAll唤醒,
							//在此基础上继续运行,继续判断是否该轮到该线程输出
							letter.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					
					letter.show();
					letter.nextLetter(let);
					letter.notifyAll();
				}
				
				
			}
			
			
		}
		
	}
	
	
}


0
0
查看评论

线程交替有序执行任务

public class Test { // 测试 public static void main(String[] args) throws Exception { Object obj = new Object(); // 启动两个线程 Thread1 t1 = new Thr...
  • pmtoam
  • pmtoam
  • 2014-08-26 14:18
  • 1277

java三线程循环有序打印ABC

迅雷笔试题: 编写一个程序,开启 3个线程,这 3个线程的 ID分别为 A、 B、 C,每个线程将自己的 ID在屏幕上打印 10遍,要求输出结果必须按 ABC的顺序显示;如: ABCABC….依...
  • mawming
  • mawming
  • 2016-08-16 15:50
  • 694

面试题--三个线程循环打印ABC10次的几种解决方法

面试题--三个线程循环打印ABC10次的几种解决方法 博客分类: 多线程Java面试题 多线程javathreadSemaphoreCondition  最近发现公司有份笔试试卷中有道多线程的题目:有三个线程分别打印A、B、C,请用多线程编程实现,在屏幕上循环打印10次...
  • hephec
  • hephec
  • 2014-07-19 11:51
  • 948

JAVA A B C 循环打印10次实现

public class PrintABC {  /**   * @param args   */  public static void main(String[] args) {   final PringABC p = ne...
  • facome
  • facome
  • 2014-05-29 09:37
  • 675

多线程(至少三个线程)分别打印A、B、C,要求按ABC的顺序循环打印10次。

看到网上一道题,三个线程按顺序打印A、B、C循环10次,于是自己按几种方法也写了一下: 一、用线程池、Lock锁和condition(Object 监视器方法的使用)组合使用实现: package multithread; import java.util.concurrent.Executo...
  • RockeyLu
  • RockeyLu
  • 2012-04-12 23:42
  • 5356

传统线程通信(子线程运行10次,主线程运行100次,如此循环50次)

/** * 传统线程通信(子线程运行10次,主线程运行100次,如此循环50次) * @author 谭飞 * @date 2012-02-02 */ public class TraditionalThreadCommunication { /** * @param...
  • feilongjian001
  • feilongjian001
  • 2012-02-03 09:38
  • 2329

启动三个线程A,B,C,打印10次 按照ABC的顺序输出

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Condition; import java.util.conc...
  • kechanghe0705
  • kechanghe0705
  • 2012-04-07 09:48
  • 2803

主线程和子线程均循环10次,两者交替运行50次

我们应该时时保持面向对象编程的思想,可以将主子线程封装到一个类中(类中的方法是两个有关联的方法) ,使用标记变量可以人为的控制线程的执行。 import java.util.ArrayList; import java.util.List; import java.util.Scanner; i...
  • Grit_ICPC
  • Grit_ICPC
  • 2017-03-19 11:44
  • 260

JAVA经典面试题:四线程写四个文件、三线程循环有序打印ABC

转子:http://blog.0hi.cn/java-classic-interview-question.html 将t1,t2,t3,t4这四个线程分别向4个文件中写入数据,t1写入1,t2写入2,t3写入3,t4写入4,分别在A,B,C,D这4个文件中写入如下内容: A:123412341...
  • le119126
  • le119126
  • 2015-09-06 11:16
  • 820

Java多线程:用三个线程控制循环输出10次ABC

题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次。 解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程。这里用一个Lock对象来...
  • u010355144
  • u010355144
  • 2015-09-09 11:39
  • 3734
    个人资料
    • 访问:36265次
    • 积分:1057
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:25篇
    • 译文:0篇
    • 评论:6条
    文章分类
    最新评论