多线程面试题:按ABC的顺序显示

简介: 笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

笔试题:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。

2017年03月21日 19:25:02


阅读数:712


这是最近笔试遇到一个多线程题,当时没有做出来,后来经过查找后,找到两种写法。


方法一:利用Lock和Condition来实现,代码如下




public class PrintABC {undefined

private String printFlag = "A";

private Lock lock = new ReentrantLock();

private Condition c1 = lock.newCondition();

private Condition c2 = lock.newCondition();

private Condition c3 = lock.newCondition();


public void printA(){undefined

lock.lock();

try {undefined

if(!printFlag.equals("A")){//1.判断是否到了状态  是-继续往下走  否-让当前线程处于等待状态

c1.await();//造成当前线程在接到信号或被中断之前一直处于等待状态。

}

System.out.println(Thread.currentThread().getName());//2.输出

printFlag = "B"; //3.将后续状态改为输出B

c2.signal();//4.唤醒输出B的线程

} catch (InterruptedException e) {undefined

e.printStackTrace();

}finally{undefined

lock.unlock();

}

}



public void printB(){undefined

lock.lock();

try {undefined

if(!printFlag.equals("B")){undefined

c2.await();

}

System.out.println(Thread.currentThread().getName());

printFlag = "C";

c3.signal();

} catch (InterruptedException e) {undefined

e.printStackTrace();

}finally{undefined

lock.unlock();

}

}


public void printC(){undefined

lock.lock();

try {undefined

if(!printFlag.equals("C")){undefined

c3.await();

}

System.out.println(Thread.currentThread().getName());

printFlag = "A";

c1.signal();

} catch (InterruptedException e) {undefined

e.printStackTrace();

}

}

//测试类

public static void main(String[] args) {undefined

final PrintABC test = new PrintABC();

new Thread(new Runnable() { //创建名称为A的线程并启动

public void run() {undefined

for(int x = 0;x<10;x++){//调用十次输出方法

test.printA();

}

}},"A").start();


new Thread(new Runnable() { //创建名称为B的线程并启动

public void run() {undefined

for(int x = 0;x<10;x++){undefined

test.printB();

}

}},"B").start();


new Thread(new Runnable() { //创建名称为C的线程并启动

public void run() {undefined

for(int x = 0;x<10;x++){undefined

test.printC();

}

}},"C").start();

}

}


相关文章
|
18天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
35 1
|
26天前
|
安全 Java
Qt经典面试题:Qt开启线程的几种方式
Qt经典面试题:Qt开启线程的几种方式
18 0
|
1月前
|
并行计算 安全 Java
C# .NET面试系列四:多线程
<h2>多线程 #### 1. 根据线程安全的相关知识,分析以下代码,当调用 test 方法时 i > 10 时是否会引起死锁? 并简要说明理由。 ```c# public void test(int i) { lock(this) { if (i > 10) { i--; test(i); } } } ``` 在给定的代码中,不会发生死锁。死锁通常是由于两个或多个线程互相等待对方释放锁而无法继续执行的情况。在这个代码中,只有一个线程持有锁,且没有其他线程参与,因此不
99 3
|
3月前
|
Java 调度 Windows
JAVA面试八股文之多线程基础知识
JAVA面试八股文之多线程基础知识
|
3月前
|
调度
【面试问题】说说线程的生命周期?
【1月更文挑战第27天】【面试问题】说说线程的生命周期?
|
26天前
|
消息中间件 存储 算法
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
【C/C++ 泡沫精选面试题04】在实际项目中,多进程和多线程如何选择?
41 1
|
28天前
|
消息中间件 算法 开发者
【Qt面试题】多线程情况下, Qt中的信号槽分别在什么线程中执行, 如何控制?
【Qt面试题】多线程情况下, Qt中的信号槽分别在什么线程中执行, 如何控制?
19 1
|
1月前
|
Java 调度
金三银四面试必问:线程有几种状态
金三银四面试必问:线程有几种状态
14 0
|
2月前
|
Java API 开发者
高逼格面试:线程封闭,新名词√
高逼格面试:线程封闭,新名词√
33 0
|
3月前
|
消息中间件 数据库
面试题解析:RabbitMQ在多线程秒杀系统中的关键作用
面试题解析:RabbitMQ在多线程秒杀系统中的关键作用
33 0