当前位置: 首页 > news >正文

1114. 按序打印

1114. 按序打印

题目描述

我们提供了一个类:

public class Foo {
  public void first() { print("first"); }
  public void second() { print("second"); }
  public void third() { print("third"); }
}

三个不同的线程 A、B、C 将会共用一个 Foo 实例。

  • 一个将会调用 first() 方法
  • 一个将会调用 second() 方法
  • 还有一个将会调用 third() 方法

请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。

 

示例 1:

输入: [1,2,3]
输出: "firstsecondthird"
解释: 
有三个线程会被异步启动。
输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。
正确的输出是 "firstsecondthird"。

示例 2:

输入: [1,3,2]
输出: "firstsecondthird"
解释: 
输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。
正确的输出是 "firstsecondthird"。

 

提示:

  • 尽管输入中的数字似乎暗示了顺序,但是我们并不保证线程在操作系统中的调度顺序。
  • 你看到的输入格式主要是为了确保测试的全面性。

解法

JAVA

/**// 使用类锁 - 同一时间只有一个线程能执行Foo foo1 = new Foo();Foo foo2 = new Foo();// foo1 和 foo2 的同步方法会互相阻塞// 使用实例锁 - 不同实例可以并发执行Foo foo1 = new Foo();Foo foo2 = new Foo();// foo1 和 foo2 的同步方法可以同时执行*/
class Foo {private int cur = 1;public Foo() {}public void first(Runnable printFirst) throws InterruptedException {synchronized(Foo.class) {while(cur != 1) {Foo.class.wait();}// printFirst.run() outputs "first". Do not change or remove this line.printFirst.run();cur++;Foo.class.notifyAll();}}public void second(Runnable printSecond) throws InterruptedException {synchronized(Foo.class) {while(cur != 2) {Foo.class.wait();}// printSecond.run() outputs "second". Do not change or remove this line.printSecond.run();cur++;Foo.class.notifyAll();}}public void third(Runnable printThird) throws InterruptedException {synchronized(Foo.class) {while(cur != 3) {Foo.class.wait();}// printThird.run() outputs "third". Do not change or remove this line.printThird.run();cur++;Foo.class.notifyAll();}}
}

Java

class Foo {private int cur = 1;private final Lock lock = new ReentrantLock();private final Condition condition = lock.newCondition();public Foo() {}public void first(Runnable printFirst) throws InterruptedException {lock.lock();try {while (cur != 1) {condition.await();}printFirst.run();cur = 2;condition.signalAll();} finally {lock.unlock();}}public void second(Runnable printSecond) throws InterruptedException {lock.lock();try {while (cur != 2) {condition.await();}printSecond.run();cur = 3;condition.signalAll();} finally {lock.unlock();}}public void third(Runnable printThird) throws InterruptedException {lock.lock();try {while (cur != 3) {condition.await();}printThird.run();cur = 1;condition.signalAll();} finally {lock.unlock();}}
}

...


http://www.jsqmd.com/news/19172/

相关文章:

  • linux 中sed命令 d与g选项的区别
  • C# Avalonia 16- Animation- SampleViewer - ReusableFollowExample
  • 2025年五金零件加工厂家权威推荐榜:精密零件/小五金加工/五金精密零件加工专业实力与品质保障精选指南
  • 2025 年风电母线槽厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • 2025年甲醇发动机润滑油厂家权威推荐榜:专业润滑技术,高效能保护,直销源头实力厂家口碑之选
  • 2025 年最新保温装饰一体板厂家排行榜:优选西宁及全国靠谱生产厂家,专业推荐值得信赖
  • 2025年10月deepseek排名优化推荐:高性价比解决方案市场报告
  • 跨网文件交换系统:保障数据安全与加速研发的核心支撑
  • 2025 最新不锈钢管厂家推荐排行榜权威发布:304/316L/2205 等材质焊管无缝管优质企业精选
  • 评测阿里云 RDS for MySQL + DuckDB 架构:QuickBI 分析性能与兼容性实测
  • 2025 年国内地磅生产厂家最新推荐排行榜:聚焦电子 / 物联网 / 无人值守 / 汽车衡 / 防爆等类型,精选综合实力强劲企业
  • 大模型后训练
  • 2025年低烟无卤辐照线厂家推荐排行榜,UL3302低烟无卤,UL3767低烟无卤,UL4413低烟无卤,专业认证与优质性能保障
  • jq工具解析JSON数据操作示例
  • 技术面:Spring(循环依赖,spring与springboot的区别)
  • CI_CD前端发布增加cnpm编译失败跳出不部署的逻辑
  • 2025年GEO品牌推荐榜单:云视GEO领跑行业的技术解析
  • confluence8
  • 2025年10月长白山度假酒店推荐:性价比与景观体验排行
  • 基于分类器AUC的无模型变点检测技术
  • 2025年除尘设备厂家权威推荐榜单:除尘器/脉冲除尘器/中央脉冲除尘器/工业除尘器源头企业综合评测与选购指南
  • 2025 年高强钢板厂家最新推荐排行榜:涵盖宝武 / 合金 / Q550D 等热门型号,优质企业综合实力甄选
  • 2025 年注浆管厂家最新推荐榜:聚焦桩基 / 钢花 / 管棚 / 隧道 / 预埋等多场景需求,精选优质厂家助力工程高效采购
  • 2025年10月中国AI关键词排名优化公司排行:五强实测评价
  • 2025年CNAS认证咨询公司推荐:权威指南,全方位服务解析
  • CRM沦为摆设?纷享销客系统运营分析功能助力企业提升数字化效能
  • 2025年10月GEO优化服务商推荐:全平台同步优化排行榜
  • 2025年10月中国AI关键词排名优化公司推荐榜:五家对比与实测排名
  • 2025年太阳能板品牌综合排名TOP10:深圳精益太阳能板领跑行业
  • 2025年太阳能板品牌综合实力排行榜TOP10:深圳精益太阳能板领跑行业