经典笔试题:3个线程连续打印XYZ
程序员文章站
2022-06-07 13:19:51
...
编写代码,使用3个线程,1个线程打印X,一个线程打印Y,一个线程打印Z,同时执行连续打印10次"XYZ"
昨天试了一下这个题目,自己的思路用的是同步队列做信号量的传递。(后面看了网上别人的一些想法是用的volatile,实际可以,用的内存更少,昨晚本来第一个思路也是,后面有点卡了就放弃了,想到用队列更加优雅,现在复盘一下思路)
- 线程一跑完线程二跑
- 线程二跑完线程三跑
- 线程三跑完线程一跑
需要一个通知的机制,用同步队列做通知,等待的时候用take等待,允许下一个流程的时候传递一个Object作为信号量。下面给出代码。
public class ThreadTest {
//1、编写代码,使用3个线程,1个线程打印X,一个线程打印Y,一个线程打印Z,同时执行连续打印10次"XYZ"
public static void main(String[] args) throws InterruptedException {
SynchronousQueue<Object> t12 = new SynchronousQueue <>();
SynchronousQueue <Object> t23 = new SynchronousQueue <>();
SynchronousQueue <Object> t31 = new SynchronousQueue <>();
Thread t1 = new Thread(()->{
for(int i=0;i<10;i++){
try {
t31.take();
System.out.print("X");
t12.put(new Object());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(()->{
for(int i=0;i<10;i++){
try {
t12.take();
System.out.print("Y");
t23.put(new Object());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t3 = new Thread(()->{
for(int i=0;i<10;i++){
try {
t23.take();
System.out.print("Z");
if(i==9) return;//结束信号
t31.put(new Object());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
t3.start();
t31.put(new Object());//开始信号
}
}
推荐阅读