【面试题:三个线程轮流打印A ,B,C】

news2024/12/24 22:14:46

面试题:三个线程轮流打印A ,B,C

  • 面试介绍说明
  • 思考方案
  • 代码实现
    • Print 打印基类
    • APrint 打印字符A 线程
    • CPrint 打印字符C 线程
    • PrintConstant 常量类
    • Str
    • Run 启动类
  • 测试结果
  • 总结

面试介绍说明

当时是2022 年3月 在深圳面试的一家公司。由于疫情比较严重,是电话面试。前面的八股文还比较熟悉,和面试官沟通的还不错。后面聊到多线程,说让实现 三个线程轮流打印 ABC。我当时听,有点懵,之前只是复习了用wait/notify 来实现生产消费者模型。只有两个主体,现在 是三个,瞬间没有了主意,当时也是 和面试官 纠缠了一会,但面试官很较真,他说 他正打开 idea,让我说,他来敲代码。于是 GG…现在又重新学习下多线程,自己突然有了思路,然后就写了下,发现居然没有毛病。特此记录下。

思考方案

还是建立在生产者和消费者模型下。 只是多个了一个主体。执行run 方法的时候,加个判断即可。
流程如下:
在这里插入图片描述

代码实现

Print 打印基类

/**
 * @author :echo_黄诗
 * @description:打印基类
 * @date :2023/2/3 17:03
 */
public class Print extends Thread{
    protected Str str;
    protected Object lock;

    public Print(Str str,Object lock) {
        this.str = str;
        this.lock=lock;
    }
}

APrint 打印字符A 线程

/**
 * @author :echo_黄诗
 * @description:打印字符A 线程
 * @date :2023/2/3 16:59
 */
public class APrint extends Print{
    public APrint(Str str, Object lock) {
        super(str, lock);
    }
    @Override
    public void run() {
        //获取锁
        synchronized (lock){
            //当前线程 状态正常的
            while (!Thread.currentThread().isInterrupted()){
                if (str.getString().equals(PrintConstant.C)){
                    System.out.println(PrintConstant.A);
                    str.setString(PrintConstant.A);
                }else {
                    lock.notifyAll();
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

CPrint 打印字符C 线程

/**
 * @author :echo_黄诗
 * @description:打印字符C 线程
 * @date :2023/2/3 17:05
 */
public class CPrint extends Print {
    public CPrint(Str str, Object lock) {
        super(str, lock);
    }

    @Override
    public void run() {
        //获取锁
        synchronized (lock){
            //当前线程 状态正常的
            while (!Thread.currentThread().isInterrupted()){
                if (str.getString().equals(PrintConstant.B)){
                    System.out.println(PrintConstant.C);
                    str.setString(PrintConstant.C);
                }else {
                    lock.notifyAll();
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

PrintConstant 常量类

/**
 * @author :echo_黄诗
 * @description:常量类
 * @date :2023/2/3 18:11
 */
public class PrintConstant {
    public static final String A="A";

    public static final String B="B";

    public static final String C="C";
}

Str

/**
 * @author :echo_黄诗
 * @description:信号量类
 * @date :2023/2/3 17:07
 */
public class Str {
    private  String string;

    public Str(String string) {
        this.string = string;
    }

    public String getString() {
        return string;
    }

    public void setString(String string) {
        this.string = string;
    }
}

Run 启动类

/**
 * @author :echo_黄诗
 * @description:测试类
 * @date :2023/2/3 17:06
 */
public class Run {
    public static void main(String[] args) {
        Object lock=new Object();
        //str 的值可以赋值
        Str str=new Str(PrintConstant.C);
        APrint aPrint=new APrint(str,lock);
        BPrint bPrint=new BPrint(str,lock);
        CPrint cPrint=new CPrint(str,lock);
        aPrint.start();
        bPrint.start();
        cPrint.start();
    }
}

测试结果

三个线程 的启动顺序没有要求。
在这里插入图片描述

总结

目前能用notify/wait 方式实现的功能,用 lock 和condition 应该都可以实现。小伙伴们有兴趣的试着用lock 来实现下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

内网渗透(三)之基础知识-域环境的介绍和优点

系列文章 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 注:阅读本编文章前,请先阅读系列文章,以免造成看不懂的情况!! 域介绍 域的介绍 Windows域是计算机网络的一种形式&#…

DMTet 阅读笔记

介绍 主页 https://nv-tlabs.github.io/DMTet/论文pdf https://nv-tlabs.github.io/DMTet/assets/dmtet.pdf视频汇报 https://slideslive.com/38967642/deep-marching-tetrahedra-a-hybrid-representation-for-highresolution-3d-shape-synthesis?refhomepage疑似代码 在nvdi…

【手写 Promise 源码】第十八篇 - EventLoop 简介

theme: fancy 一,前言 近期公司项目比较忙,粘了老博客几篇 Spring 源码来充数,周末腾出时间把 Promise 做个收尾; 在开始 EventLoop 前,我对 Promise 源码部分进行了简单回顾,并更新了【Promise 源码学习…

【链表面试题】解决环形链表和相交链表问题

在力扣上发现这样的几道题,尝试做了一下,也发现了一个关于这类题的一种做法:快慢指针的使用。废话不多说,上例题 目录 一、环形链表 1.定义(概念) 2.如何判断是否为环形链表 1.快慢指针 2.为什么快指针…

限期出国|CSC资助赴世界top50名校英国曼彻斯特大学访学

我们先为J老师40天获得佐治亚理工学院(美国三大理工学院之一)的访问学者邀请函,又成功申报CSC。后因其担心被美国拒签要求重新申请英国名校,10天后拿到跻身世界top50英国曼彻斯特大学的offer,后经ATAS审批、CSC改派、使…

linux基本功系列-help命令实战

文章目录前言🚀🚀🚀一. help命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示某个命令的帮助信息3.2 查看某个命令的简述3.3 以伪man手册格式输出cd信息四. windows中的help总结前言🚀🚀🚀 想要学好Lin…

车载网络 - Autosar网络管理 - 基本概念

Autosar作为当前车载行业使用最为广泛的一种汽车开发系统架构,网上也有很多相关的介绍;不过我看很多有完整的来讲一下这个规范的,一般都是只讲了其中一部分,我这就准备搞出来一套完整版本的Autosar网络管理的规范、测试设计、自动…

新C++(7):多态那些事儿_下

"当人类悬浮到腐朽,有谁愿追随彗星漂流哦~"一、多态原理(1)虚函数表指针(虚表指针)紧接上一篇sizeof(Base)这一小段说起。class Base1 { public:void func(){} private:int _a; };class Base2 { public:virtual void func() {} private:int _a; };我们知道…

【我刚毕业,学习Java开发工程师能学会吗?没有基础?】

对于Java专业来说,学历还是有一定的要求。一般都是本科学历,至少也有个大专,其次就是年龄越年轻越好。现在转行Java的年轻人很多,学历这方面越高越有竞争力一些,尤其是在后期的职业晋升阶段。如果想走管理路线&#xf…

耗时一周整体,这4款黑科技电脑软件,功能强大到离谱

闲话少说,直上狠货。 1、有道云笔记 有道云这是一款国民级的文稿编辑器,俗话说得好,好记性不如烂笔头,强大实用的笔记软件,能让你的工作与学习事半功倍。5大文稿类型,让记录得心应手,随时进行创…

第十四章 集合(Set)

一、Set 接口(P518) 1. Set接口基本介绍 (1)无序(添加和取出的顺序不一致),没有索引 (2)不允许重复元素,所以最多包含一个 null 2. Set接口的常用方法 和 …

SpringBoot中MQ使用

本文记录学习在Spring Boot中使用MQ。一 什么是MQMQ全称(Message Queue)又名消息队列,是一种异步通讯的中间件。它的作用类似于邮局,发信人(生产者)只需要将信(消息)交给邮局,然后由邮局再将信(消息)发送给具体的接收者…

博途1200PLC/1500PLCMODBUS从站通信应用

博途PLC作为MODBUS主站通信请参看下面的文章链接: 博途PLC 1200/1500PLC MODBUS-RTU通讯优化(状态机编程)_博途plc modbus-rtu通信优化_RXXW_Dor的博客-CSDN博客博途PLC 1200/1500PLC MODBUS-RTU通讯_RXXW_Dor的博客-CSDN博客_博图modbus通讯1、1200PLC的modbus通讯,可以参看…

HTTP协议(1)

1)HTTP协议是倾向于相遇业务层次上面的一种协议,传输层协议主要考虑的是端对端之间的一个传输过程,TCP重点进行关注的是可靠传输;咱们的HTTP/1,HTTP/2是基于TCP的,但是咱们的HTTP/3是基于UDP的,但是当下的互…

实战动态代理

代理模式介绍代理模式有点像老大和小弟,也有点像分销商。主要解决的是问题是为某些资源的访问、对象的类的易用操作上提供方便使用的代理服务。而这种设计思想的模式经常会出现在我们的系统中,或者你用到过的组件中,它们都提供给你一种非常简…

【CVPR 2018】PU-Net: Point Cloud Upsampling Network

文章目录PU-Net: Point Cloud Upsampling Network网络架构训练数据生成点特征嵌入Feature ExpansionCfoordinate Reconstruction端到端训练Joint Loss FunctionPU-Net: Point Cloud Upsampling Network 网络架构 PU-Net有四个组件:patch extraction, point feature…

「自定义类型」C语言中的构造数据类型如结构,联合,枚举

​​​​​​​🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀目录 🐰结构 🏡 前言 🌸数据类型的定义 &…

SpringBoot动态导出word文档(完美实整教程 复制即可使用,不能实现你找我)

背景 最近有一个需求是需要动态导出合同、订单等信息,导出一个word文档供客户进行下载查看。 需要导出的word文件,主要可以分为两种类型。 导出固定内容和图片的word文档导出表格内容不固定的word文档 经过对比工具,我实践过两种实现方式…

一文细说引导内存分配器

一、引导内存分配器 1.引导内存分配器的作用 因为内核里面有很多内存结构体,不可能在静态编译阶段就静态初始化所有的这些内存结构体。另外,在系统启动过程中,系统启动后的物理内存分配器本身也需要初始化,如伙伴分配器&#xff…

OD笔试题-空汽水瓶可以换汽水

/*** 某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水&#xff0c;允许向老板借空汽水瓶&#xff08;但是必须要归还&#xff09;。* 小张手上有n个空汽水瓶&#xff0c;她想知道自己最多可以喝到多少瓶汽水。* 数据范围&#xff1a;输入的正整数满足 1≤n≤100* <p>*…