LeetCode From Easy To Hard No6[Easy]: Print in Order 按顺序执行线程

国央企创新负责人如何实现科技创新资源的系统化管理和高效配置?.docx 国央企创新负责人如何实现科技创新资源的系统化管理和高效配置? 立即下载

Suppose we have a class:

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

The same instance of Foo will be passed to three different threads. Thread A will call first(), thread B will call second(), and thread C will call third(). Design a mechanism and modify the program to ensure that second() is executed after first(), and third() is executed after second().

 

Example 1:

Input: [1,2,3]
Output: "firstsecondthird"
Explanation: There are three threads being fired asynchronously. The input [1,2,3] means thread A calls first(), thread B calls second(), and thread C calls third(). "firstsecondthird" is the correct output.

Example 2:

Input: [1,3,2]
Output: "firstsecondthird"
Explanation: The input [1,3,2] means thread A calls first(), thread B calls third(), and thread C calls second(). "firstsecondthird" is the correct output.

 

Note:

We do not know how the threads will be scheduled in the operating system, even though the numbers in the input seems to imply the ordering. The input format you see is mainly to ensure our tests' comprehensiveness.

 

要求按顺序执行线程顺序打印出:first -> second -> third

主要用wait()和notifyAll()方法实现:

wait()方法:释放CPU执行权,释放对象锁

notifyAll(): 唤醒所有正在等待该对象锁的线程。

class Foo {
    // 定义两个标识控制second 和 third 运行顺序
    private boolean run2;
    private boolean run3;
    final private byte[] lock = new byte[1]; // 对象锁
    public Foo() {
        this.run2 = false;
        this.run3 = false;
    }

    public void first(Runnable printFirst) throws InterruptedException {
        synchronized (lock) {
            // printFirst.run() outputs "first". Do not change or remove this line.
            printFirst.run();
            run2 = true; // 设置second 方法为true跳过while循环直接打印结果
            lock.notifyAll();
        }
    }

    public void second(Runnable printSecond) throws InterruptedException {
        synchronized (lock) {
            while (!run2) {
                lock.wait(); // run2 为 false 时,线程等待,释放cpu执行权同时释放对象锁
            }
            // printSecond.run() outputs "second". Do not change or remove this line.
            printSecond.run();
            run3 = true; // 设置third方法为true跳过while循环直接打印结果
            lock.notifyAll();
        }

    }

    public void third(Runnable printThird) throws InterruptedException {
        synchronized (lock) {
            while (!run3) {
                lock.wait(); // run3 为 false 时,线程等待,释放cpu执行权同时释放对象锁
            }
            // printThird.run() outputs "third". Do not change or remove this line.
            printThird.run();
        }
    }
}

自己做完又到了参考大佬们代码的时候:

大佬用的是java current 包的Semaphore类:

import java.util.concurrent.*;
class Foo {
    Semaphore run2, run3;

    public Foo() {
        run2 = new Semaphore(0);
        run3 = new Semaphore(0);
    }

    public void first(Runnable printFirst) throws InterruptedException {
        printFirst.run();
        run2.release();
    }

    public void second(Runnable printSecond) throws InterruptedException {
        run2.acquire();
        printSecond.run();
        run3.release();
    }

    public void third(Runnable printThird) throws InterruptedException {
        run3.acquire(); 
        printThird.run();
    }
}

关于Semaphore类,大佬的解释如下:

https://leetcode.com/problems/print-in-order/discuss/332890/Java-Basic-semaphore-solution-8ms-36MB

  1. Semaphore is a bowl of marbles (or locks in this case). If you need a marble, and there are none, you wait. You wait until there is one marble and then you take it. If you release(), you will add one marble to the bowl (from thin air). If you release(100), you will add 100 marbles to the bowl (from thin air).
  2. The thread calling third() will wait until the end of second() when it releases a '3' marble. The second() will wait until the end of first() when it releases a '2' marble. Since first() never acquires anything, it will never wait. There is a forced wait ordering.
  3. With semaphores, you can start out with 1 marble or 0 marbles or 100 marbles. A thread can take marbles (up until it's empty) or put many marbles (out of thin air) at a time

Semaphore 可以控制允许活动的线程数量也就是线程并发数量。new 的时候需要传递一个参数代表同一时间允许活动的线程数量。线程需要通过acquire()方法获取许可,如果允许活动线程数量为0,则调用acquire()之后,线程会进入等待队列,直到调用release()释放许可。上边解法new Semaphore(0),证明线程需要等待直到允许活动的线程数大于0,release() 方法可以解放一个线程,如果在此之前允许活动的线程数量为0,则会凭空添加一个允许活动的线程。

电池、AA‑CAES 与抽水蓄能多目标优化调度研究(三目标:成本、峰谷差、碳排放)(Matlab代码实现) 内容概要:本文针对电池、先进绝热压缩空气储能(AA-CAES)与抽水蓄能三种储能技术,构建了一个多目标优化调度模型,旨在协同优化电力系统的运行成本、负荷峰谷差和碳排放三个关键指标。研究采用Matlab进行代码实现,建立了综合考虑各类储能系统运行特性的精细化数学模型,并通过多目标优化算法求解Pareto最优前沿,深入分析了不同优化目标间的内在权衡与博弈关系。文中系统阐述了各储能单元的数学建模方法、系统运行约束条件的设定以及多目标优化问题的规范化处理流程,最终通过详细的仿真算例验证了所提模型与方法的有效性,充分展示了该调度策略在促进新能源消纳、降低系统综合运行成本和减少碳排放方面的巨大潜力与应用价值。; 适合人群:具备电力系统、能源经济或优化理论基础知识的研究生、科研人员及从事能源规划与调度的工程技术人员。; 使用场景及目标:①研究包含多种新型储能技术的综合能源系统协调调度问题;②学习如何建立电力系统多目标优化模型(涵盖经济性、环保性和运行稳定性);③掌握利用Matlab实现多目标优化算法并进行结果可视化分析与决策的方法。; 阅读建议:此资源以Matlab代码为核心,不仅提供了严谨的理论模型,更有完整的可运行代码实现。读者在学习时应结合代码深入理解模型构建的每一个细节,包括变量的定义、复杂约束的处理以及目标函数的加权聚合方法,并建议尝试修改模型参数或调整目标权重,以观察系统行为的动态变化,从而深化对多目标优化本质和工程应用的理解。 立即下载

相关推荐

产业园区运营负责人如何精准匹配企业技术需求与科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

[Java]LeetCode1114. 按序打印 | Print in Order

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址://www.cnblogs.com/streng...

weixin_30564785的博客 341

A股分钟数据涵盖股票、ETF、可转债及指数四大类 每条数据记录包含精确到分钟的时间戳,以及开盘价、最高价、最低价、收盘价、成交量、成交额六个核心字段 部分数据还提供前收盘价作为参考 股票与ETF数据细

A股分钟数据涵盖股票、ETF、可转债及指数四大类。每条数据记录包含精确到分钟的时间戳,以及开盘价、最高价、最低价、收盘价、成交量、成交额六个核心字段。部分数据还提供前收盘价作为参考。股票与ETF数据细分至1分钟、5分钟等周期,可转债在交易时段内逐笔生成分钟快照,指数数据则同步覆盖上证、深证等主要宽基指数,便于观察市场整体走势。 数据源:CMES金融数据库

线程顺序执行的8种方法

1.使用线程的join方法 join():是Theard的方法,作用是调用线程需等待该join()线程执行完成后,才能继续用下运行。 应用场景:当一个线程必须等待另一个线程执行完毕才能执行时可以使用join方法。 package com.matao.threaddemo.join; /** * join()应用场景:当前线程需要等待另一个线程执行完毕 */ public class SonT...

Piratesa的博客 904

产业园区运营负责人如何借助平台实现创新资源的动态配置与精准对接?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

基于变频控制的多相交错LLC谐振变换器闭环仿真(Simulink仿真实现)

内容概要:本文系统介绍了基于变频控制的多相交错LLC谐振变换器在Simulink环境下的闭环仿真研究,涵盖了系统建模、关键参数设计、变频控制策略(如PFM)的实现以及闭环控制系统构建与仿真验证的完整流程。重点阐述了如何通过调节开关频率实现对输出电压的精确控制,并结合多相交错技术有效降低输入输出电流纹波,提升变换器的功率密度、转换效率及动态响应性能。文中配套提供了完整的Simulink仿真模型、详细的计算书与参考文献,帮助读者深入理解LLC谐振变换器的工作原理、谐振特性与工程设计方法。; 适合人群:具备扎实的电力电子技术、自动控制理论基础,熟悉Simulink仿真平台操作,从事开关电源、新能源变换器、车载充电机、高效率DC-DC变换器研发等领域的硕士研究生、工程师及科研人员。; 使用场景及目标:①深入掌握LLC谐振变换器的核心工作原理与变频控制(PFM)的实现机制;②学习多相交错技术在抑制电流纹波、实现均流方面的工程应用;③实践完整的闭环控制系统设计、仿真与调试,包括控制器参数整定与动态性能分析;④为学术论文撰写、毕业课题研究或工业级产品开发提供可靠的技术参考与仿真原型。; 阅读建议:此资源以Simulink仿真实现为核心,兼具理论深度与工程实践价值。建议读者在学习过程中,务必结合所提供的仿真模型与计算书,亲自动手搭建系统,反复调整控制参数(如PI控制器增益、频率调节范围),并仔细观察系统的启动、负载突变、输入电压扰动等动态响应过程,从而深刻理解控制策略的设计逻辑与系统性能的优化方法。

微信公众号 LeetCode MarkDown模版

md2all markdown: 排版代码风格为:Dracula 每次要记得声明原创!!! >微信公众号:**猫的尾巴有墨水** 关注可了解更多的教程及排版技巧。问题或建议,请公众号留言; **[如果你觉得这篇对你有帮助,欢迎赞赏](#jump_20)[^1]** [TOC] ### 题目简介 这个题目是关于多线顺序调用的问题。 ### 题目内容 #### 题号:1114 ##...

科技向善 738

20个闭环渗透测试项目:从漏洞发现到简历突围

渗透测试不仅是工具使用,更是对系统设计缺陷与实现偏差的深度推演。理解OWASP Top 10、Burp Suite等基础能力只是起点,真正具备工程价值的是能复现、可验证、可协作的完整攻击链。本文聚焦真实业务场景下的SSRF协议绕过、JWT签名机制缺陷、Redis未授权利用、Kong网关配置风险及etcd存储结构分析等核心热词,揭示漏洞本质在于架构决策与配置偏差的叠加态。适用于红队实战、甲方安全建设与乙方渗透审计等多类岗位,帮助从业者将技术动作升维为技术叙事。

weixin_32234493的博客 415

实现线程的顺序执行

之前,看到过一个题目,是关于如何使得线程顺序执行的当时,我的第一个想法就是使用join方法,在t3线程内部调用t2线程的join()方法,然后在t2内部继续调用t1线程的join方法来实现线程的顺序执行,话不多说,手写代码来测试结果:/*实现三个线程的顺序执行 * coded by Jerome */ public class ThreadRun { public static void ...

caisongcheng_good的博客 803

Ansys Zemax与Speos协同设计:从HUD光学优化到驾驶环境可视化全流程解析

本文深入解析了如何利用Ansys Zemax与Speos进行协同设计,实现从HUD光学系统核心优化到驾驶环境可视化验证的全流程。文章强调了HUD设计是光学性能与视觉感知的深度耦合,通过Zemax进行精密光学设计,再利用Speos进行系统级仿真与感知模拟,最终完成从虚拟到现实的闭环验证,有效提升HUD产品的开发效率与可靠性。

weixin_29199873的博客 251

Unity面试题总结

Unity面试题

sinat_34014668的博客 1万+

LeetCode 1114. Print in Order--Java解法--并发问题

LeetCode题解专栏:LeetCode题解 我做的所有的LeetCode的题目都放在这个专栏里,大部分题目Java和Python的解法都有。 题目地址:Print in Order - LeetCode Suppose we have a class: public class Foo { public void first() { print("first"); } publi...

个人博客 1394

FPGA时钟设计陷阱:为什么你的MRCC引脚总触发Place 30-675错误?

本文深入解析FPGA开发中常见的Place 30-675错误,揭示MRCC引脚与时钟资源分配的关键问题。通过对比MRCC与普通IO引脚特性,分析错误根源,并提供时钟约束优化、IP核重配置和手动布局三套解决方案,帮助工程师规避时钟设计陷阱,提升FPGA系统稳定性。

potato的博客 693

2019 PayPal实习生招聘编程卷复盘:外企笔试的筛选逻辑

在技术面试准备中,算法功底与工程素养缺一不可。以并发编程、分布式系统设计为代表的核心能力,正成为外企笔试与支付行业技术筛选的重点。从线程池的优雅关闭到接口幂等性保障,这些原理不仅关乎代码健壮性,更直接影响真实业务场景下的稳定性与一致性。理解哈希环、状态机、阻塞队列等基础概念,有助于应对高并发、高可用的工程挑战。本文以PayPal实习生招聘编程卷为例,还原外企在线笔试的命题风格与考察维度,拆解从数据结构到分布式设计的常见题型,并给出HackerRank平台上的实战策略,为准备海外技术面试的读者提供可落地的参考

weixin_34175509的博客 374

构建基于知识图谱的金融风险关联网络可视化系统

知识图谱是一种用于表示实体及其关系的图形结构,能够将分散的数据组织成易于理解和查询的形式。语义性:通过实体和关系的描述,赋予数据语义。结构化:以图的形式组织数据,便于计算机处理。动态性:支持实时更新,能够反映数据的最新状态。风险关联网络是指将金融风险事件、实体及其关系以图形形式表示的网络。关联性:能够展示风险事件之间的相互影响。动态性:能够实时反映风险变化。可视化:便于金融从业者直观理解风险分布。可视化系统是指通过图形界面展示数据或信息的系统。提供直观的数据显示。帮助用户快速理解复杂数据。

AI天才研究院 1061

优化dalsa相机检测界面

上节实现了使用qt结合dalsa相机显示检测到缺陷的画面,由于窗口过于简陋,本节将进行一个界面优化。

A1983Z的博客 991

【Python面试通关手记】3.2 数据结构与算法:栈与队列

"""单调递减栈模板"""stack = []# 破坏单调性时弹出# 弹出时确定结果# 根据问题记录结果# ...stack.append(val) # 索引入栈或值入栈"""滑动窗口双端队列模板"""# 1. 移除过期元素# 2. 维护单调性dq.pop()# 3. 入队# 4. 收集结果。

m0_50709695的博客 87

《S32系列芯片——Boot & HSE详解》持续更新中...

专栏总目录,将详细介绍S32系列芯片的Boot功能,最终给出HSE基于IVT的Secure Boot方案!!!

车载系统攻城狮 4387

双堆结构高效计算数据流中位数:原理与Python实现

中位数计算是数据分析中的基础操作,其核心在于高效维护数据的有序性。传统排序方法在动态数据流场景下时间复杂度较高,而双堆结构通过最大堆和最小堆的组合,将插入操作优化到O(logn)、查询优化到O(1)。这种数据结构设计利用了堆的快速插入删除特性,最大堆维护较小的一半数据,最小堆维护较大的一半,通过动态平衡策略确保中位数始终位于堆顶。在实时监控、金融分析等高频数据流场景中,该算法能显著提升性能。Python的heapq模块虽仅实现最小堆,但通过存储负值巧妙模拟了最大堆行为,为工程实践提供了简洁高效的解决方案。

weixin_33912453的博客 421

Android 13.0 SystemUI下拉状态栏背景增加高斯模糊背景

在13.0的产品开发中,发现现在很多产品都是高斯模糊背景的,这种高斯模糊背景看起来效果很不错,产品开发需要SystemUI下拉状态栏背景也是高斯模糊背景,所以就要来实现下拉状态栏高斯模糊背景

安卓兼职framework和app工程师的博客 2670

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

掌阅大数据岗笔试全解析:从题型拆解到备考策略

大数据技术已成为互联网企业驱动业务增长的核心引擎,从数据采集、清洗加工到数仓建模与实时计算,每一个环节都考验工程师对组件原理与工程落地的综合理解。掌握Hadoop生态、Spark、Flink等主流框架的底层机制,以及维度建模、数据质量治理等数仓理论,是数据岗位的基本功。在实际业务场景中,数据研发不仅要会写SQL和代码,更要能准确理解指标口径,将技术方案与业务目标对齐。本文基于一场真实的数字阅读领域大数据岗笔试,详细拆解客观题、编程题、SQL题与系统设计题的考察逻辑,并给出针对性的备考清单与答题策略,帮助求职

weixin_33845881的博客 411

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

搜狗校招测试岗笔试复盘:从Linux命令到自动化测试全考点解析

在软件测试工程师的招聘考核中,笔试环节往往不只是考察单一知识点,而是综合衡量候选人的计算机基础、测试思维与工程实践能力。从Linux日志分析、网络协议排查到SQL数据验证,再到测试用例设计与自动化框架应用,这些高频技术构成了测试岗位的核心技能栈。理解TCP握手、HTTP状态码、接口响应耗时等原理,能帮助测试人员快速定位问题链路;掌握等价类、边界值等用例设计方法,则能系统保障功能质量。无论是校招笔试还是日常测试工作,将基础工具与测试理论结合,是提升效率与可靠性的关键。本文以一次真实的企业笔试复盘为例,梳理了从

weixin_34323858的博客 523

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

小米2020测开笔试题二解剖:五大核心模块与备战策略

在软件测试工程师的成长路径中,笔试环节往往比想象中更看重开发功底。测试开发岗位的本质是先开发后测试,因此编程基础、计算机网络、操作系统、数据库与Linux命令成为筛选候选人的核心维度。这类题目背后考察的是对HTTP协议、并发处理、SQL查询等底层原理的理解,以及在自动化测试、接口测试、性能排障等真实工程场景中的运用能力。测试设计题则进一步检验等价类划分、边界值分析等测试理论能否落地。小米校招测开笔试题二正是围绕这些能力展开的典型代表,针对编程限时编码、网络与系统基础、数据库与Linux操作、压轴测试方案设计

weixin_28829339的博客 294

LeetCode_1114.按顺序打印(多线程)

LeetCode_1114 LeetCode-1114.按顺序打印 我们提供了一个类: public class Foo { public void one() { print("one"); } public void two() { print("two"); } public void three() { print("three"); } } 三个不同...

weixin_30532837的博客 300
上一篇: LeetCode From Easy To Hard No5[Easy]: Unique Morse Code Words 独一无二的摩斯密码
下一篇: LeetCode From Easy To Hard No7[Medium]: Print Zero Even Odd 按顺序打印[010203...0n]
我属码
博客等级 码龄10年 2粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值