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

Java经典面试题-多线程打印

thread+synchronized

就好像一个圆圈,A->B->C->A。。。。。

synchronized能够保证多个线程进入实,只用一个线程能进入。

/**多线程交替打印* */
public class Task {private final Object lock = new Object();private int count = 0;public static void main(String[] args) {Task task = new Task();new Thread(()->{for(int i=0;i<10;i++){task.printA();}}).start();new Thread(()->{for(int i=0;i<10;i++){task.printB();}}).start();new Thread(()->{for(int i=0;i<10;i++){task.printC();}}).start();}public void printA(){synchronized (lock){while(count!=0){try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print("A");count++;lock.notifyAll();}}public void printB(){synchronized (lock){while(count!=1){try{lock.wait();}catch (InterruptedException e){e.printStackTrace();}}System.out.print("B");count++;lock.notifyAll();}}public void printC(){synchronized (lock){while(count!=2){try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}System.out.print("C");count=0;lock.notifyAll();}}
}

ReentrantLock

public class Task2 {private  final Lock lock=new ReentrantLock();private final Condition condition=lock.newCondition();private final Condition condition1=lock.newCondition();private final Condition condition2=lock.newCondition();private int state=0;public static void main(String[] args) {Task2 tash2 = new Task2();Thread thread = new Thread(tash2::printA);Thread thread1 = new Thread(tash2::printB);thread.start();thread1.start();}private void printA(){// get locklock.lock();try{for(int i=0;i<10;i++){while(state!=0){condition.await();}System.out.print("a");state=1;condition1.signal();}} catch (InterruptedException e) {throw new RuntimeException(e);}finally {lock.unlock();}}private  void printB(){lock.lock();try{for(int i=0;i<10;i++){while(state!=1){condition1.await();}System.out.print("b");state=0;condition.signal();}} catch (InterruptedException e) {throw new RuntimeException(e);}finally {lock.unlock();}}
}

Semaphore

信号量机制,设置刚开始的值为1,如果减去1的结果>=0,则执行该线程,否则不执行,执行完释放,值加1

public final void acquireShared(int arg) {if (tryAcquireShared(arg) < 0)acquire(null, arg, true, false, false, 0L);}/*** Acquires in shared mode, aborting if interrupted.  Implemented* by first checking interrupt status, then invoking at least once* {@link #tryAcquireShared}, returning on success.  Otherwise the* thread is queued, possibly repeatedly blocking and unblocking,* invoking {@link #tryAcquireShared} until success or the thread* is interrupted.* @param arg the acquire argument.* This value is conveyed to {@link #tryAcquireShared} but is* otherwise uninterpreted and can represent anything* you like.* @throws InterruptedException if the current thread is interrupted*/public final void acquireSharedInterruptibly(int arg)throws InterruptedException {if (Thread.interrupted() ||(tryAcquireShared(arg) < 0 &&acquire(null, arg, true, true, false, 0L) < 0))throw new InterruptedException();}
package com.r.ThreadTask;import javax.swing.text.Segment;
import java.util.concurrent.Semaphore;public class Task3 {private final Semaphore semaphore=new Semaphore(1);private final Semaphore semaphore1=new Semaphore(0);private final Semaphore semaphore2=new Semaphore(0);public static void main(String[] args) {Task3 task3 = new Task3();Thread thread = new Thread(task3::printA);Thread thread1 = new Thread(task3::printB);Thread thread2 = new Thread(task3::printC);thread.start();thread1.start();thread2.start();}private void printA(){for(int i=0;i<10;i++){try {semaphore.acquire();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.print("a");semaphore1.release();}}private void printB(){for(int i=0;i<10;i++){try {semaphore1.acquire();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.print("b");semaphore2.release();}}private void printC(){for(int i=0;i<10;i++){try {semaphore2.acquire();} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.print("c");semaphore.release();}}
}

相关文章:

Java经典面试题-多线程打印

threadsynchronized 就好像一个圆圈&#xff0c;A->B->C->A。。。。。 synchronized能够保证多个线程进入实&#xff0c;只用一个线程能进入。 /**多线程交替打印* */ public class Task {private final Object lock new Object();private int count 0;public st…...

FireFox简单设置设置

文章目录 一 设置不显示标签页1原来的样子2新的样子3操作方法 二 设置竖直标签页栏1 效果图2 设置方法 三 设置firefox不提醒更新 一 设置不显示标签页 1原来的样子 2新的样子 3操作方法 地址栏输入 about:config搜索icon,双击选项列表中browserchrome.site icons的值&#…...

Sollong手机——一站式Web3生态解决方案

从定义上讲&#xff0c;Web3公司也属于互联网公司&#xff0c;不过与传统互联网公司相比&#xff0c;他们有一个很明显的特征&#xff1a;他们不断尝试做去中心化的事&#xff0c;一步步将数据和金融的控制权从美联储&#xff08;央行和金融机构&#xff09;、苹果&#xff08;…...

《重生到现代之从零开始的数据结构生活》—— 顺序表1

线性表 线性表&#xff1a;是n个具有相同特性的数据元素的有限序列。 线性表是⼀种在实际中⼴泛使 ⽤的 数据结构&#xff0c;常⻅的线性表有顺序表、链表、栈、队列、字符串等等 线性表在逻辑上是线性结构&#xff0c;也就说是连续的⼀条直线。但是在物理结构上并不⼀定是连…...

2本书让你轻松入门大模型!《大模型入门:技术原理与实战应用》+《自然语言处理:大模型理论与实践》

随着大模型技术的不断完善和普及&#xff0c;我们将进入一个由数据驱动、智能辅助的全新工作模式和生活模式。个人和企业将能够利用大模型来降本增效&#xff0c;并创造全新的用户体验。 人工智能是人类探索未来的重要领域之一&#xff0c;以GPT为代表的大模型应用一经推出在短…...

【JDK17 | 1】Java 17 深入剖析:新特性与变革

引言 Java 17 是 Oracle 发布的一个重要版本,它不仅是一个长期支持(LTS)版本,还引入了许多新的特性和改进,为开发者提供了更强大的工具和更优雅的编程体验。在本专栏的文章中,我们将对 Java 17 的新特性进行深入剖析,帮助开发者更好地理解和利用这一版本。 1. 新特性概述…...

strtok

strtok函数原型 char *strtok&#xff08;conset char *str,conset char *dst&#xff09;; 功能&#xff1a; 将字符串分割成一个一个片段 当strtok&#xff08;&#xff09;在参数str的字符串中发现参数dst中包含的分割字符时&#xff0c;则会将该字符改为\0字符 当连续出现…...

零信任身份安全的基本原则

零信任身份安全的核心原则就是 “持续验证&#xff0c;永不信任”。可以通过以下6个方面理解&#xff1a; 对“谁”和“什么”进行认证和授权 在零信任身份安全模型中&#xff0c;对用户和设备的身份进行认证和授权是至关重要的。认证是确认用户或设备是其所宣称的身份的过程…...

【AAOS】Android Automotive 9模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-9.0.0_r61 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emulator Home界面 MAP All apps S…...

手动降级wsl中的numpy

下载完pytorch之后想验证一下cuda好不好使&#xff0c;在测试的时候发现一个warning python中报错如下 我下载的pytorch版本比较低&#xff0c;numpy太高&#xff0c;所以需要手动给numpy降级 pip install numpy\<2 降级后再进到python验证cuda就没有warning和报错了&…...

极客兔兔Gee-Cache Day7

protobuf配置&#xff1a; 从 Protobuf Releases 下载最先版本的发布包安装。解压后将解压路径下的 bin 目录 加入到环境变量即可。 如果能正常显示版本&#xff0c;则表示安装成功。 $ protoc --version libprotoc 3.11.2在Golang中使用protobuf&#xff0c;还需要protoc-g…...

R包:APAlyzer从RNA-seq数据计算APA表达丰度

文章目录 介绍教程实战案例数据脚本运行 介绍 今天安利APAlyzer工具&#xff0c;它是通过RNA-seq数据获取3′UTR APA, intronic APA等表达谱的R包。 APAlyzer将bam文件比对到PolyA-DB数据库识别APA。 Most eukaryotic genes produce alternative polyadenylation (APA) isofo…...

YOLOv11改进策略【损失函数篇】| 利用MPDIoU,加强边界框回归的准确性

一、背景 目标检测和实例分割中的关键问题&#xff1a; 现有的大多数边界框回归损失函数在不同的预测结果下可能具有相同的值&#xff0c;这降低了边界框回归的收敛速度和准确性。 现有损失函数的不足&#xff1a; 现有的基于 ℓ n \ell_n ℓn​范数的损失函数简单但对各种尺度…...

dayu_widgets-简介

前言: 越来越多的人开始使用python来做GUI程序&#xff0c;市面上却很少有好的UI控件。即使有也是走的商业收费协议&#xff0c;不敢使用&#xff0c;一个不小心就收到法律传票。 一、原始开源项目: 偶然在GitHub上发现了这个博主的开源项目。https://github.com/phenom-films…...

改变数组页面重新渲染的操作/那些操作不会重新渲染页面以及解决方法

在前端开发中&#xff0c;当数组数据发生变化时&#xff0c;是否会导致页面重新渲染&#xff0c;以及如何进行相关操作&#xff0c;这取决于使用的具体框架或库&#xff08;如React、Vue等&#xff09;及其内部机制。以下是对这一问题的详细解答&#xff1a; 一、会导致页面重…...

米哈游Android面试题汇总及参考答案

Java 的内存回收机制是如何工作的? 在 Java 中,内存回收主要由垃圾回收器(Garbage Collector)来完成。 Java 的内存主要分为堆(Heap)和栈(Stack)等区域。其中,对象主要分配在堆上。当创建一个对象时,会在堆上为其分配内存空间。 垃圾回收器主要负责回收不再被使用的对…...

搜维尔科技:【应用】Xsens动作捕捉技术为奇幻电影注入活力

在英格兰古朴的小镇和连绵起伏的群山之间&#xff0c;坐落着一个虚构的小镇Anghenfil&#xff0c;在这里有一个早已被人遗忘的传说。在这部由英国电影制片人Ryan Garry自编自导的奇幻电影《Every Legend Ends》中&#xff0c;这个传说即将变成可怕的现实。 怪物苏醒&#…...

useradd命令:添加Linux新用户

一、命令简介 ​useradd​ 命令用于在 Linux 系统中创建新用户账号。 ‍ 二、命令参数 useradd [选项] 用户名一些常用的选项包括&#xff1a; -c, --comment "Comment" : 为用户账号添加注释信息。-m, --create-home: 创建用户的家目录。-s, --shell /path/to/…...

Python+ffmpeg实现字幕视频合并

背景 我想给自己的视频添加字幕&#xff0c;但是市面上比较好的软件都不太对我口味&#xff0c;要么贵&#xff0c;要么就是学习版不给力。兜兜转转&#xff0c;我决定用多款开源软件分步实现&#xff0c;当然&#xff0c;也可以去白piao某些软件的字幕功能。 驱动力 ffmpeg…...

垂直分库分表、水平分库分表

垂直分库&#xff1a;分出来的数据库的结构完全不一样&#xff0c;垂直分库&#xff0c;更像单体项目到问服务项目过度&#xff0c;根据业务拆分多个模块&#xff0c;每个模块把数据单独抽离出来作为数据库&#xff0c;垂直分库就是根据不同的表业务放在不同放数据库里&#xf…...

别再依赖SDK了!手把手教你用OpenCV和Eigen从零实现RGB-D相机对齐(附完整C++代码)

从零实现RGB-D相机对齐&#xff1a;OpenCV与Eigen实战指南 在计算机视觉领域&#xff0c;RGB-D相机的深度与彩色图像对齐&#xff08;D2C&#xff09;是一个基础但至关重要的技术环节。虽然市面上大多数商用RGB-D相机都提供了现成的SDK和API来实现这一功能&#xff0c;但对于真…...

从零到一:在个人PC上部署并集成ChatGLM-6B到Unity应用

1. 环境准备与模型下载 在个人PC上部署ChatGLM-6B需要先搞定三件事&#xff1a;硬件检查、软件环境搭建和模型文件获取。我的老款游戏本&#xff08;i7-9750H RTX2060 6GB显存&#xff09;实测可以流畅运行&#xff0c;关键在于正确的量化配置。 硬件检查要点&#xff1a; 显存…...

Altium Designer实战:用xSignals搞定DDR4内存的等长布线,告别时序烦恼

Altium Designer实战&#xff1a;用xSignals实现DDR4内存精准等长布线 在高速PCB设计中&#xff0c;DDR4内存接口的布线一直是硬件工程师面临的技术高地。当信号速率突破2400MHz时&#xff0c;地址、命令与数据线之间哪怕几个ps的时序偏差都可能导致系统不稳定。传统手工计算网…...

打造便携式Kali Linux安全评估工具:OpenClaw USB定制全攻略

1. 项目概述&#xff1a;一个便携式安全评估工具的诞生 在安全研究、渗透测试或者应急响应的现场&#xff0c;你经常会遇到一个经典困境&#xff1a;目标环境可能是一台物理隔离的机器&#xff0c;或者是一台你无法安装任何软件的“干净”主机。你需要一个功能强大、即插即用的…...

【CH32V307实战】4P OLED屏I2C驱动移植与快速显示指南

1. CH32V307与4P OLED屏的硬件连接指南 第一次拿到CH32V307开发板和4P OLED屏时&#xff0c;最让我头疼的就是接线问题。这种4线制OLED&#xff08;通常标注为4P或4PIN&#xff09;相比传统的7线制简化了不少&#xff0c;但引脚定义各家厂商可能略有差异。经过多次实测&#xf…...

Linuxbonding链路稳定性治理方法

Linuxbonding链路稳定性治理方法这是一篇面向中级 Linux 使用者的技术文章&#xff0c;主题聚焦在bonding链路&#xff0c;重点讨论链路聚合、冗余切换和接口状态。在真实生产环境中&#xff0c;bonding链路相关问题往往不会以单一错误形式出现&#xff0c;而是混杂在日志、权限…...

技术解构:逆向工程视角下的百度网盘下载链接解析机制

技术解构&#xff1a;逆向工程视角下的百度网盘下载链接解析机制 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 想象一下&#xff0c;当你收到朋友分享的百度网盘链接时&…...

从零构建情感大语言模型:基于EmoLLM的实践指南

1. 项目概述&#xff1a;当大语言模型学会“察言观色”最近在折腾一个挺有意思的开源项目&#xff0c;叫SmartFlowAI/EmoLLM。光看名字你可能就猜到了&#xff0c;这玩意儿跟“情绪”和“大语言模型”有关。没错&#xff0c;它的核心目标就是让冷冰冰的LLM&#xff08;Large La…...

乌尔都语语音合成落地难?揭秘ElevenLabs未公开的ur-PK语言代码陷阱与ISO 639-3双标适配规范(仅限首批127家认证开发者知晓)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;乌尔都语语音合成落地难&#xff1f;揭秘ElevenLabs未公开的ur-PK语言代码陷阱与ISO 639-3双标适配规范&#xff08;仅限首批127家认证开发者知晓&#xff09; ElevenLabs 官方文档中仅标注 ur 为乌尔…...

Arm Iris调试接口:架构设计与工程实践详解

1. Iris调试与追踪接口深度解析调试与追踪技术是嵌入式系统开发的核心支柱&#xff0c;而Arm的Iris接口代表了这一领域的最新进展。作为一名长期从事嵌入式调试工具开发的工程师&#xff0c;我将带您深入剖析这套接口的设计哲学与实战应用。1.1 接口架构设计理念Iris的架构设计…...