当前位置: 首页 > 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.hskmm.com/?act=detail&tid=36393

相关文章:

  • 2025年地铺石材品牌口碑排行榜TOP10:选购指南与行业趋势解析
  • 2025年市面上地铺石材品牌排名前十揭秘:行业趋势与选择指南
  • 2025年陶瓷过滤板厂家权威推荐榜:专业生产微孔陶瓷过滤板、耐高温陶瓷过滤板、工业用陶瓷过滤板源头厂家实力解析
  • 2025 年路沿石生产厂家最新推荐榜单:聚焦优质企业,全方位解析核心优势助采购决策花岗岩/大理石/芝麻白/路沿石石材厂家推荐
  • 为什么后悔在创业中用RUST这个妖魔化宣传的语言
  • 跨网文件交换系统:保障数据安全与加速研发的核心支撑
  • linux 中sed命令 d与g选项的区别
  • C# Avalonia 16- Animation- SampleViewer - ReusableFollowExample
  • 2025 最新不锈钢管厂家推荐排行榜权威发布:304/316L/2205 等材质焊管无缝管优质企业精选
  • 2025 年风电母线槽厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • jq工具解析JSON数据操作示例
  • 技术面:Spring(循环依赖,spring与springboot的区别)
  • CI_CD前端发布增加cnpm编译失败跳出不部署的逻辑
  • 2025年GEO品牌推荐榜单:云视GEO领跑行业的技术解析
  • confluence8
  • 大模型后训练
  • 2025年低烟无卤辐照线厂家推荐排行榜,UL3302低烟无卤,UL3767低烟无卤,UL4413低烟无卤,专业认证与优质性能保障
  • 2025年10月长白山度假酒店推荐:性价比与景观体验排行
  • 2025 年最新推荐!景观石厂家推荐排行榜,涵盖千层石 / 泰山石 / 鹅卵石等多品类,全方位解析优质品牌助您精准选择
  • 2025 年注浆管厂家最新推荐榜:聚焦桩基 / 钢花 / 管棚 / 隧道 / 预埋等多场景需求,精选优质厂家助力工程高效采购
  • CRM沦为摆设?纷享销客系统运营分析功能助力企业提升数字化效能
  • 2025年10月GEO优化服务商推荐:全平台同步优化排行榜
  • 2025年10月中国AI关键词排名优化公司推荐榜:五家对比与实测排名
  • 2025年太阳能板品牌综合排名TOP10:深圳精益太阳能板领跑行业
  • 2025年太阳能板品牌综合实力排行榜TOP10:深圳精益太阳能板领跑行业
  • 2025年中国国际健康营养博览会(NHNE):深度解析亚洲旗舰展的供需对接机制
  • 2025年中国国际健康营养博览会(NHNE):深度解析亚洲旗舰展的供需匹配机制
  • 2025年10月geo优化服务商推荐:主流口碑榜全对比
  • 2025年中国国际健康营养博览会(NHNE):权威深度解析亚洲旗舰展的供需新秩序
  • 2025 年铝板厂家最新推荐榜:聚焦优质铝板企业,为工业与建筑采购提供专业参考1100/3003/3004/5052/5083/ 6061铝板厂家推荐