欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

经典笔试题: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());//开始信号
    }
}