多线程面试手撕题

2023-11-13

  1. 按序打印
    我们提供了一个类:

public class Foo {
public void one() { print(“one”); }
public void two() { print(“two”); }
public void three() { print(“three”); }
}
三个不同的线程将会共用一个 Foo 实例。

线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法
请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。

示例 1:

输入: [1,2,3]
输出: “onetwothree”
解释:
有三个线程会被异步启动。
输入 [1,2,3] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 two() 方法,线程 C 将会调用 three() 方法。
正确的输出是 “onetwothree”。
示例 2:

输入: [1,3,2]
输出: “onetwothree”
解释:
输入 [1,3,2] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 three() 方法,线程 C 将会调用 two() 方法。
正确的输出是 “onetwothree”。

class Foo {
    private boolean firstFinished;
    private boolean secondFinished;
    private Object lock = new Object();
    public Foo() {
        
    }

    public void first(Runnable printFirst) throws InterruptedException {
        
        // printFirst.run() outputs "first". Do not change or remove this line.
        synchronized(lock){
        printFirst.run();
        firstFinished =true;
        lock.notifyAll();
        }

    }

    public void second(Runnable printSecond) throws InterruptedException {
        
        // printSecond.run() outputs "second". Do not change or remove this line.
        synchronized(lock){
            while(!firstFinished){
                lock.wait();
            }
          printSecond.run();
          secondFinished = true;
          lock.notifyAll();
        }

    }

    public void third(Runnable printThird) throws InterruptedException {
        
        // printThird.run() outputs "third". Do not change or remove this line.
        synchronized(lock){
            while(!secondFinished){
                lock.wait();
            }
             printThird.run();
        }

    }
}
  1. 交替打印FooBar
    我们提供一个类:

class FooBar {
public void foo() {
for (int i = 0; i < n; i++) {
print(“foo”);
}
}

public void bar() {
for (int i = 0; i < n; i++) {
print(“bar”);
}
}
}
两个不同的线程将会共用一个 FooBar 实例。其中一个线程将会调用 foo() 方法,另一个线程将会调用 bar() 方法。

请设计修改程序,以确保 “foobar” 被输出 n 次。

class FooBar {
private int n;
private Semaphore foo = new Semaphore(1);
private Semaphore bar = new Semaphore(0);
public FooBar(int n) {
this.n = n;
}

public void foo(Runnable printFoo) throws InterruptedException {
    
    for (int i = 0; i < n; i++) {
        foo.acquire();
    	// printFoo.run() outputs "foo". Do not change or remove this line.
    	printFoo.run();
        bar.release();
    }
}

public void bar(Runnable printBar) throws InterruptedException {
    
    for (int i = 0; i < n; i++) {
        bar.acquire();
        // printBar.run() outputs "bar". Do not change or remove this line.
    	printBar.run();
        foo.release();
    }
}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多线程面试手撕题 的相关文章

随机推荐

  • 嵌入式单片机及其相关博客及教程

    一 单片机 1 嵌入式单片机程序架构之时间片轮询法 https mp weixin qq com s F6FGDwW Rqaxzf9BYcg6yQ 2 stm32 f429 移植 littlevGL https mp weixin qq c
  • 芯片设计中的latch_闩锁效应(Latch-up)详解

    在CMOS集成电路中 闩锁效应不容忽视 这篇文章将从0开始给大家介绍闩锁效应 Latch up 以及有效抑制闩锁效应的方法 一 背景知识 1 双极结型晶体管 Bipolar Junction Transistor BJT 图1 NPN型BJ
  • 四、数据库与身份认证

    目录 安装与配置MySQL MySQL的基本使用 使用 MySQL Workbench 管理数据库 1 连接数据库 2 了解主界面的组成部分 3 创建数据库 4 创建数据表 5 向表中写入数据 SQL 的 SELECT 语句 1 语法 2
  • 视频的容器与格式

    转发自 http blog csdn net tttyd article details 6893392 1 视频容器格式简介 一般而言 视频文件的扩展名就是视频的容器名 比如 avi文件 或者 mp4文件 avi和mp4只是容器格式 好比
  • 五大开源Web服务器

    开源产品的出现不仅获得了个人用户的喜爱 众多知名企业也青睐于它 虽然开源产品数不胜数 但并不是每一个开源产品都能被广泛应用并得到大众的好评 在众多成功的开源产品中 只有少数领头羊 而其它产品只能望其项背 本文汇总了五款开源Web服务器 来看
  • STM32F103 实验 输入捕获

    目录 本文 在上一章的基础上 将介绍如下内容 输入捕获 上一篇 STM32F103 实验 PWM输出 https blog csdn net qq 40318498 article details 96475438 参考 STM32F103
  • 测试——自动化测试(Selenium工具)

    目录 一 自动化测试的概念以及分类 二 Selenium web自动化测试工具 1 自动化测试的一些前置工作 2 第一个自动化实例 3 总结 编辑 三 Selenium常用方法 定位元素的方法 元素的操作 等待 强制等待 待补充 隐式等待
  • C++学习——函数调用运算符、function类模板

    一 函数调用运算符 1 圆括号 就是函数调用的明显标记 有一个称呼叫做 函数调用运算符 2 如果我在类中重载了函数调用运算符 那么我们就可以像使用函数一样使用该类的对象了 对象 实参 class BiggerThanZero public
  • C++初探 5-1(for循环)

    目录 注 for循环 for循环的组成部分 1 表达式和语句 2 非表达式和语句 3 修改规则 for循环的使用例 阶乘的计算与存储 修改循环更新的步长 使用for循环访问字符串 递增运算符 和 递减运算符 副作用和顺序点 前缀格式和后缀格
  • NoSQL简介和兴起的原因

    NoSQL简介和兴起的原因 NoSQL数据库具有以下几个特点 1 灵活的可扩展性 2 灵活的数据模型 3 与云计算紧密融合 怎么理解横向扩展和纵向扩展 纵向扩展 传统思想 把电脑的CPU配到顶配 内存扩展 硬盘扩大 就可以让单机更高效率地处
  • 用字节数截取字符串

    昨天去参加中科软的笔试 编程题有一道是关于字符串的 用字节数来截取字符串 如果出现中文被截断了 应该丢去中文的那个字节 如 String a 中aaa国ccc 截取6个字节的字符串 即 中aaa 国 的前一部分 设计一个函数 把截到的中文的
  • 电路设计中发光二极管用作指示灯时的限流电阻如何选择

    在设计电路时经常要用到发光二极管作为指示灯 按照网上所查到的限流电阻计算方法一般得到的限流电阻阻止在几十到一百多欧姆 电源为5V或者3 3V 但是在实际使用中我们一般使用的限流电阻不会这么小 下面是限流电阻的计算公式 R VCC VF IF
  • 表格单元格td设置宽度无效的解决办法

    http zzstudy offcn com archives 11366 在做table页面时 有时对td设置的宽度是无效的 td的宽度始终有内部的内容撑开 可以设置padding 但直接设置width却无效 下面我们来具体看下这个示例
  • 如何更好的理解PFC(功率因数校正)

    功率因数补偿 在上世纪五十年代 已经针对具有感性负载的交流用电器具的电压和电流不同相 图1 从而引起的供电效率低下提出了改进方法 由于感性负载的电流滞后所加电压 由于电压和电流的相位不同使供电线路的负担加重导致供电线路效率下降 这就要求在感
  • redis面试题(转)

    转自 https blog csdn net xiaozhegaa article details 80692017 1 什么是Redis Redis本质上是一个Key Value类型的内存数据库 很像memcached 整个数据库统统加载
  • CSerialPort教程4.3.x (5) - CSerialPort在cmake中的使用

    CSerialPort教程4 3 x 5 CSerialPort在cmake中的使用 环境 系统 windows 10 64位 QT 5 12 9 5 9及以上版本支持cmake构建 MFC vs2008 前言 CSerialPort项目是
  • Vsftp安装与配置

    在linux环境下 使用最多的FTP服务端软件就是Vsftpd 系统用户模式虽然可以控制访问 但是如果用户过多 就会影响服务器系统的管理 对服务器安全造成威胁 而且我们需要的仅仅是可以使用搭建在服务器的FTP服务而已 那么就需要我们设置虚拟
  • Elasticsearch实战(六)---高级搜索 boost控制权重实现搜索结果排名

    Elasticsearch实战 Boost 搜索结果排名 文章目录 Elasticsearch实战 Boost 搜索结果排名 1 Boost权重控制 1 1 准备数据 1 2 默认查询 1 3 boost控制修改权重 2 多Shard Bo
  • 十七、定时任务

    一 为什么需要定时任务 相关业务场景多 例如 1 凌晨一点进行相关数据同步 2 定时发送文章 3 半小时全量推送某些数据给用户 二 单机定时任务 Timer java util Timer是 JDK 1 3 开始就已经支持的一种定时任务的实
  • 多线程面试手撕题

    按序打印 我们提供了一个类 public class Foo public void one print one public void two print two public void three print three 三个不同的线程