1116. 打印零與奇偶數

題目描述

現有函數 printNumber 可以用一個整數參數調用,并輸出該整數到控制臺。

例如,調用 printNumber(7) 將會輸出 7 到控制臺。
給你類 ZeroEvenOdd 的一個實例,該類中有三個函數:zero、even 和 odd 。ZeroEvenOdd 的相同實例將會傳遞給三個不同線程:

線程 A:調用 zero() ,只輸出 0
線程 B:調用 even() ,只輸出偶數
線程 C:調用 odd() ,只輸出奇數
修改給出的類,以輸出序列 “010203040506…” ,其中序列的長度必須為 2n 。

實現 ZeroEvenOdd 類:

ZeroEvenOdd(int n) 用數字 n 初始化對象,表示需要輸出的數。
void zero(printNumber) 調用 printNumber 以輸出一個 0 。
void even(printNumber) 調用printNumber 以輸出偶數。
void odd(printNumber) 調用 printNumber 以輸出奇數。

示例 1:

輸入:n = 2
輸出:“0102”
解釋:三條線程異步執行,其中一個調用 zero(),另一個線程調用 even(),最后一個線程調用odd()。正確的輸出為 “0102”。
示例 2:

輸入:n = 5
輸出:“0102030405”

提示:

1 <= n <= 1000

解題思路

此題與1115很像,都是線程的交替執行問題,不同的是有三個線程,可以用同步信號量來實現交替打印。
值得注意的是,像1115題中那樣通過while循環等待同步信號量的方式在此題會超時,所以我們在等待的時候需要釋放cpu資源, 可以使用Thread.yield() 實現

代碼實現

import java.util.function.IntConsumer;class ZeroEvenOdd {private int n;volatile int flag = 2;public ZeroEvenOdd(int n) {this.n = n;}// printNumber.accept(x) outputs "x", where x is an integer.public void zero(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i++) {while(flag != 2) {Thread.yield();}printNumber.accept(0);flag = i % 2;}}public void even(IntConsumer printNumber) throws InterruptedException {for(int i = 2; i <= n; i += 2) {while(flag != 0) {Thread.yield();}printNumber.accept(i);flag = 2;}}public void odd(IntConsumer printNumber) throws InterruptedException {for(int i = 1; i <= n; i += 2) {while(flag != 1) {Thread.yield();}printNumber.accept(i);flag = 2;}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40814.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

六、快速啟動框架:SpringBoot3實戰-個人版

六、快速啟動框架&#xff1a;SpringBoot3實戰 文章目錄 六、快速啟動框架&#xff1a;SpringBoot3實戰一、SpringBoot3介紹1.1 SpringBoot3簡介1.2 系統要求1.3 快速入門1.4 入門總結回顧復習 二、SpringBoot3配置文件2.1 統一配置管理概述2.2 屬性配置文件使用2.3 YAML配置文…

短劇app開發搭建需要哪些資質證件?

短劇APP需要辦理的資質包括增值電信業務經營許可證&#xff08;ICP&#xff09;、網絡文化經營許可證&#xff08;文網文&#xff09;、廣播電視節目制作經營許可證&#xff0c;以及軟件著作權&#xff08;軟著&#xff09;。 增值電信業務經營許可證&#xff08;ICP&#xff…

ODOO17的郵件機制-系統自動推送修改密碼的郵件

用戶收到被要求重置密碼的郵件&#xff1a; 我們來分析一下ODOO此郵件的工作機制&#xff1a; 1、郵件模板定義 2、渲染模板的函數&#xff1a; 3、調用此函數的機制&#xff1a; 當用戶移除或增加了信任的設備&#xff08;如電腦、手機端等&#xff09;&#xff0c;系統會自…

Python爬蟲之什么是逆向工程?逆向是什么?

Python爬蟲之什么是逆向工程&#xff1f;逆向是什么&#xff1f; 在Python爬蟲領域&#xff0c;逆向工程是一種重要的技術手段&#xff0c;尤其在面對復雜的網站結構和加密的數據時。逆向工程通常涉及對目標網站的分析&#xff0c;包括其前端代碼、后端邏輯、數據傳輸方式等&am…

CentOS 7.9 停止維護(2024-6-30)后可用在線yum源 —— 筑夢之路

眾所周知&#xff0c;centos 7 在2024年6月30日&#xff0c;生命周期結束&#xff0c;官方不再進行支持維護&#xff0c;而很多環境一時之間無法完全更新替換操作系統&#xff0c;因此對于yum源還是需要的&#xff0c;特別是對于互聯網環境來說&#xff0c;在線yum源使用方便很…

三級_網絡技術_01_網絡系統結構與設計的基本原則

1.下列關于RPR技術的描述中&#xff0c;錯誤的是()。 RPR與FDDI一樣使用雙環結構 在RPR環中&#xff0c;源節點向目的節點成功發出的數據幀要由目的節點從環中收回 RPR環中每一個節點都執行MPLS公平算法 RPR環能夠在50ms內實現自愈 2.下列關于RPR技術的描述中&#xff0c;…

從0到1:培訓老師預約小程序開發筆記二

背景調研 培訓老師預約小程序&#xff1a; 教師和學生可以更便捷地安排課程&#xff0c;并提升教學質量和學習效果&#xff0c;使之成為管理和提升教學效果的強大工具。培訓老師可以在小程序上設置自己的可預約時間&#xff0c;學員可以根據老師的日程安排選擇合適的時間進行預…

記錄第一次使用air熱更新golang項目

下載 go install github.com/cosmtrek/airlatest 下載時提示&#xff1a; module declares its path as: github.com/air-verse/air but was required as: github.com/cosmtrek/air 此時&#xff0c;需要在go.mod中加上這么一句&#xff1a; replace github.com/cosmtrek/air &…

如何使用Pip從Git倉庫安裝Python包:深入探索遠程依賴管理

如何使用Pip從Git倉庫安裝Python包&#xff1a;深入探索遠程依賴管理 Python的包管理工具Pip使得安裝和管理Python庫變得非常簡單。有時&#xff0c;我們需要安裝那些尚未發布到PyPI的包&#xff0c;或者想要嘗試最新的開發版本。這時&#xff0c;可以直接從Git倉庫安裝包。本…

qt QGridLayout 簡單實驗1

1.概要 2.實驗 2.1 實驗1 簡單實驗跨行 2.1.1 代碼 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~W…

STM32 - 內存分區與OTA

最近搞MCU&#xff0c;發現它與SOC之間存在諸多差異&#xff0c;不能沿用SOC上一些技術理論。本文以STM L4為例&#xff0c;總結了一些STM32 小白入門指南。 標題MCU沒有DDR&#xff1f; 是的。MCU并沒有DDR&#xff0c;而是讓代碼存儲在nor flash上&#xff0c;臨時變量和棧…

yolov5實例分割跑通以及C#讀取yolov5_Seg實例分割轉換onnx進行檢測部署

一、首先需要訓練yolov5_seg的模型&#xff0c;可以去網上學習&#xff0c;或者你直接用我的&#xff0c; 訓練環境和yolov5—7.0的環境一樣&#xff0c;你可以直接拷過來用。 yolov5_seg算法 鏈接&#xff1a;https://pan.baidu.com/s/1m-3lFWRHwg5t8MmIOKm4FA 提取碼&…

【MySQL】1.初識MySQL

初識MySQL 一.MySQL 安裝1.卸載已有的 MySQL2.獲取官方 yum 源3.安裝 MySQL4.登錄 MySQL5.配置 my.cnf 二.MySQL 數據庫基礎1.MySQL 是什么&#xff1f;2.服務器&#xff0c;數據庫和表3.mysqld 的層狀結構4.SQL 語句分類 一.MySQL 安裝 1.卸載已有的 MySQL //查詢是否有相關…

《Windows API每日一練》8.3 scrollbar控件

在第三章SYSMETS2.C實例中&#xff0c;我們是通過CreateWindow函數創建窗口的參數窗口樣式中添加垂直或水平滾動條。本節我們將講述作為子窗口控件的滾動條。 本節必須掌握的知識點&#xff1a; 滾動條類 滾動條控件和著色 8.3.1 滾動條類 ■窗口滾動條與滾動條控件的異同 …

Python常量與變量的終極指南:從基礎到進階的15個要點

今天&#xff0c;我們將一起揭開Python中最基本但也極其重要的概念——常量與變量的神秘面紗。別擔心&#xff0c;我會用最簡單直白的語言&#xff0c;讓你從入門到略有小成&#xff0c;一步步掌握這些核心知識。準備好你的筆記本&#xff0c;讓我們開始這場Python之旅吧&#…

在Linux環境下搭建Redis服務結合內網穿透實現通過GUI工具遠程管理數據庫

文章目錄 前言1. 安裝Docker步驟2. 使用docker拉取redis鏡像3. 啟動redis容器4. 本地連接測試4.1 安裝redis圖形化界面工具4.2 使用RDM連接測試 5. 公網遠程訪問本地redis5.1 內網穿透工具安裝5.2 創建遠程連接公網地址5.3 使用固定TCP地址遠程訪問 前言 本文主要介紹如何在Li…

mysql 9 新特新

mysql9新特性 新特性Audit Log NotesC API NotesCharacter Set SupportCompilation NotesComponent NotesConfiguration NotesData Dictionary NotesData Type NotesDeprecation and Removal NotesEvent Scheduler NotesJavaScript ProgramsOptimizer NotesPerformance Schema …

Spring中的事件監聽器使用學習

一、什么是Spring中的事件監聽機制&#xff1f; Spring框架中的事件監聽機制是一種設計模式&#xff0c;它允許你定義和觸發事件&#xff0c;同時允許其他組件監聽這些事件并在事件發生時作出響應。這種機制基于觀察者模式&#xff0c;提供了一種松耦合的方式來實現組件間的通信…

Linux 系統性能分析與故障排查:從入門到進階

Linux 系統性能分析與故障排查&#xff1a;從入門到進階 作為系統管理員或 IT 專業人員&#xff0c;掌握系統性能分析和故障排查技能至關重要。這些技能可以幫助你識別和解決系統性能問題&#xff0c;確保系統穩定運行。本文將介紹系統性能分析和故障排查的基本方法&#xff0…

CTF實戰:從入門到提升

CTF實戰&#xff1a;從入門到提升 &#x1f680;前言 沒有網絡安全就沒有國家安全&#xff0c;網絡安全不僅關系到國家整體信息安全&#xff0c;也關系到民生安全。近年來&#xff0c;隨著全國各行各業信息化的發展&#xff0c;網絡與信息安全得到了進一步重視&#xff0c;越…