经典笔试题:3个线程连续打印XYZ

编写代码,使用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());//开始信号
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值