关于wait/notify以及顺序打印

多线程顺序打印的5种解法 多线程同步的方式有许多,有传统的synchronized锁,还可以使用lock锁,下面列举多线程顺序打印的5种解法,算作对线程同步的一个总结。 文章目录经典面试题 经典面试题 1.三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC…”的字符串 2.两个线程交替打印 0~100 的奇偶数 3.通过 N 个线程顺序循环打印从 0 至 100 4.多线程按顺序调用,A->B->C,AA 打印 5 次,BB 打印10 次,CC 打印 15. 阅读详情

1.等待和唤醒是同一个对象
2.notify只会唤醒一个线程


使用角度
1.Object.wait() 会抛出 InterruptedException
2.调用object.wait() 必须首先对object(monitor lock) 进行加锁

class Main{
    private static Object object = new Object();
    private static class AThread extends Thread{
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println("A 在扫地");
            }
            try {
                synchronized (object) {
                    object.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for (int i = 0; i < 10; i++) {
                System.out.println("A 正在擦桌子");
            }
        }
    }

    public static void main(String[] args) {
        Thread aThread = new AThread();
        aThread.start();

        Scanner scanner = new Scanner(System.in);
        System.out.println("随便输入什么,A去擦桌子");
        scanner.nextLine();
        synchronized (object){
            object.notify();
        }
    }
}

sync(object){
object.wait
}
调用到wait 释放锁,进入waiting状态,从等待集出来只会,还会再加一次锁(请求锁)


注意事项:

  1. 必须先加锁,才能调用wait
  2. wait和notify必须是同一对象
  3. wait会释放锁(等待在哪个对象上,释放哪个锁)
  4. wait返回之前,需要再次加锁
  5. notify只会唤醒一个,并且是随机
  6. notifyAll会唤醒所有的
  7. wait和notify之间的时序很重要

顺序打印

public class PrintInOrder {
    private  static  int i = 0;

    public synchronized void first() throws InterruptedException {
        if (i == 0) {
            System.out.println("One");
            i = 1;
            notifyAll();
        }
        wait();
    }
    public  synchronized void second() throws InterruptedException {
        if (i == 1) {
            System.out.println("two");
            i = 2;
            notifyAll();
        }
        wait();
    }
    public  synchronized void third() throws InterruptedException {
        if (i == 2) {
            System.out.println("three");
            i = 0;
            notifyAll();
        }
        wait();
    }
    private static class printOne extends Thread{
        PrintInOrder object;

        public printOne(PrintInOrder object) {
            this.object = object;
        }

        @Override
        public void run() {
            while (true){
                try {
                    object.first();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private static class PrintTwo extends Thread{
        PrintInOrder object;

        public PrintTwo(PrintInOrder object) {
            this.object = object;
        }

        @Override
        public void run() {
            while (true){
                try {
                    object.second();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private static class PrintThree extends Thread{
        PrintInOrder object;

        public PrintThree(PrintInOrder object) {
            this.object = object;
        }

        @Override
        public void run() {
            while (true){
                try {
                    object.third();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    public static void main(String[] args) throws InterruptedException {
        PrintInOrder object = new PrintInOrder();
        Thread t1 = new printOne(object);
        t1.start();
        Thread t2 = new PrintTwo(object);
        t2.start();
        Thread t3 = new PrintThree(object);
        t3.start();
    }
}
实现多线程交替打印问题 方法:在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行。无论线程1、线程2、线程3哪个先执行,最后执行的顺序都是线程1——>线程2——>线程3。再看第三个问题,N个线程循环打印1-100,其实仔细想想这个和三个线程循环打印ABC并没有什么本质区别,只需要加上判断是否到了打印数字的最大值的语句即可。其实这类问题本质上都是线程通信问题,思路基本上都是一个线程执行完毕,阻塞该线程,唤醒其他线程,按顺序执行下一个线程。,只有线程B拿到锁后,不被阻塞,执行。 阅读详情

相关推荐

实现三个线程轮流执行顺序打印ABC

这道题目在多线程的面试题中可能遇到的比较多,由于最近一直在学习Java多线程编程的知识,这里做一个总结,总结的可能并不是很全面,有问题或者有更好的编程方法也欢迎大家指出。 这道题目的实现方式很多,这里就以我了解的进行一个总结。 首先,我们看一下题目: 有三个线程A、B、C,采用多线程的方式使三个线程轮流执行顺序打印ABC 10次,结果如下: 通过wait/notify实现 package tes...

Bobo‘s Home 1万+

多线程保证并发顺序执行的细节&3个线程轮流打印1-10

多线程保证并发顺序执行的细节&3个线程轮流打印1-10...... 为什么下面的代码中,要用 while 而不是 if ? if不行吗?

xy779323365的博客 3576

摩尔线程GPU实战:5分钟搞定AI模型部署(含Docker避坑指南)

本文详细介绍了摩尔线程GPU在AI模型部署中的实战应用,包括环境配置、Docker避坑指南及性能优化技巧。通过5分钟快速部署指南,帮助开发者高效利用摩尔线程GPU进行AI模型推理,特别针对常见兼容性问题提供解决方案,显著提升部署效率。

weixin_28736335的博客 454

Java多线程:线程通信:生产者 和 消费者 || 顺序打印

在Object.java中,定义了wait(), notify()和notifyAll()等方法。wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而是唤醒所有的线程。异常这 三个wait(),notify(), notifyAll()方法只有在synchronized方法或synchronized代码块中才能使用,否则会报异常如下是图示说明。

weixin_61635597的博客 575

别自己写CDC了!聊聊Xilinx AXI4-Stream Clock Converter IP里的寄存器管道模式到底有多省资源

本文探讨了Xilinx AXI4-Stream Clock Converter IP核的寄存器管道模式在FPGA设计中的高效资源利用。通过对比手工CDC实现,详细解析了IP核的精简化同步架构和时序收敛优势,并提供了实战案例和优化策略,帮助工程师快速实现时钟域转换,显著提升设计效率和性能。

weixin_33738555的博客 441

深入解析USBlyzer抓包工具:从设备描述符到数据交互实战

本文深入解析了USBlyzer抓包工具在USB协议分析中的应用。从设备描述符的抓取与解读,到设置地址、配置描述符的实战分析,再到数据交互阶段的抓包技巧,文章通过具体案例详细展示了如何使用USBlyzer透视USB总线通信,是排查设备驱动问题、逆向分析通信协议和学习USB规范的实用指南。

weixin_29171087的博客 741

java-notify/wait写给自己看的 三个线程abc顺序打印

面试题 多线程轮流顺序打印 a,b,c三个线程按顺序打印数字1-96 线程a打印1,b打印2,c打印3 ......  具体的程序实现见如下连接 1.notify 必须放在 synchronized(obj){}代码块中   while(true) 挂一个循环体 synchronized(lock){     if(){         lock.notifyAll();     }else{...

maqingbin8888的专栏 1012

Unity游戏开发实战:手把手教你用C#实现一个简单的反向运动学(IK)控制器

本文详细介绍了在Unity游戏开发中如何使用C#实现一个简单的反向运动学(IK)控制器。通过建立骨骼层级结构、实现CCD算法和角度限制,开发者可以轻松创建自然的角色动画效果。文章还提供了可视化调试工具和性能优化方案,帮助提升开发效率。

weixin_42523711的博客 244

面试题:6种解法-顺序打印A1B2C3

顺序打印A1B2C3问题是一个典型的线程间通信和同步问题,对于这个问题,常见的实现方式包括使用锁、阻塞队列、信号量,Atomc原子操作类,需要根据实际需求进行选择。同时,也需要注意多线程编程中常见的问题,如线程安全、死锁、内存泄漏等,从而保证代码的质量和稳定性。作者:喝咖啡的工匠。

BASK2312的博客 718

电力市场小白必看:手把手教你用Matlab实现市场出清电价计算(附完整代码)

本文为电力市场初学者提供了使用Matlab计算市场出清电价的完整指南。通过Yalmip和Matpower工具包,详细讲解了从环境配置到模型构建、求解及结果分析的整个过程,帮助读者快速掌握节点电价计算的核心技术。

weixin_30379531的博客 73

用FPGA驱动WS2812B点阵,手把手教你实现动态文字显示(附完整Verilog代码)

本文详细介绍了如何使用FPGA驱动WS2812B点阵实现动态文字显示,包括硬件连接、Verilog代码实现和动态效果设计。通过精确的时序控制和数据处理,读者可以掌握FPGA与WS2812B的交互技术,并实现炫酷的显示效果。附完整Verilog代码,适合硬件爱好者和工程师参考实践。

weixin_30482383的博客 669

三个线程轮流打印ABC

1、多线程if和where的区别: 就是用if判断的话,唤醒后线程会从wait之后的代码开始运行,但是不会重新判断if条件,直接继续运行if代码块之后的代码,而如果使用while的话,也会从wait之后的代码运行,但是唤醒后会重新判断循环条件,如果不成立再执行while代码块之后的代码块,成立的话继续wait。 2、 一.概述wait()方法可以使线程进入等待状态,而notify()可以使等待的状态唤醒 wait,notify和notifyAll方法是Object类的成员函数,所以Java的任何一个.

Infor_learning的博客 7747

备战2025数学建模国赛(算法46):多目标优化

本篇博客将深入浅出地介绍多目标优化的核心概念、主流算法,并重点结合一个数学建模竞赛的经典案例,提供完整的Python代码实现,助你在未来的竞赛中游刃有余。它通过寻找帕累托最优解集,完美地诠释了“鱼与熊掌不可兼得”的权衡思想,为最终决策提供科学依据。这些问题都包含多个相互冲突的目标,传统的单目标优化方法(如梯度下降、单纯形法)对此无能为力,因为它们无法同时优化多个目标。在数学建模竞赛中,我们面临的绝大多数问题都不是单一的“最好”,而是充满权衡与妥协的“最优”。记住,成功的建模不仅在于解出问题,更在于清晰地。

YOLO 285

线程打印_多个线程顺序打印问题,一网打尽

大家在换工作面试中,除了一些常规算法题,还会遇到各种需要手写的题目,所以打算总结出来,给大家个参考。第一篇打算总结下阿里最喜欢问的多个线程顺序打印问题,我遇到的是机试,直接写出运行。同类型的题目有很多,比如三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的字符串两个线程交替打印 0~100 的奇偶数通过 N 个线程顺序循环打印从 0 至 1...

weixin_27653327的博客 387

API Streaming Failed 400 <400>InternalError.Algo.InvalidParameter input content must be a string解决方案

本文主要介绍了API Streaming Failed 400 <400> InternalError.Algo.InvalidParameter input content must be a string解决方案,希望能对使用vscode中cline的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【多线程】wait 和 notify

合理的协调多个线程之间的执行先后顺序.

HuTool的博客 987

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

线程打印_手撕面试题:多个线程交替打印问题

大家在换工作面试中,除了一些常规算法题,还会遇到各种需要手写的题目,所以打算总结出来,给大家个参考。全文 2929 字,剩下的是代码,P6 及以下阅读只需要 8 分钟,高 P 请直接关闭第一篇打算总结下阿里最喜欢问的多个线程顺序打印问题,我遇到的是机试,直接写出运行。同类型的题目有很多,比如三个线程分别打印 A,B,C,要求这三个线程一起运行,打印 n 次,输出形如“ABCABCABC....”的...

weixin_31572321的博客 440

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

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

多线程打印

缺点:效率低,会出现浪费的竞争。比如说,一直是偶数线程拿到锁,进行判断后不满足条件,就不会去执行打印语句,然后跳出,这样的话很多次竞争拿到锁是没有意义的。线程 1 输出 a 5 次,线程 2 输出 b 5 次,线程 3 输出 c 5 次。● 第二,如果有些干扰线程错误地 notify 了 wait 线程,条件不满足时还要重新等待,使用了 while 循环来解决 此问题。优点:效率高,一个线程拿到锁就去打印,打印完,唤醒其他线程,自己就休眠,每次的竞争都是有意义的。比如,必须先 2 后 1 打印。

qq_52416556的博客 444

【有料】多个线程分别顺序交替打印一种不同字符ABCDEFG(已实现随便多少个线程打印多少个字符,利用线程池实现多线程)

取消正在执行的线程(实际上仅仅是设置正在执行线程的中断标志位,调用线程的 interrupt 方法来中断线程)。3秒后,主线程调用shutdownNow,这里主要是为了将正在运行的线程设置中断标志位,死循环利用中断标志位结束循环,或线程调用了等待方法(如wait)会抛出异常InterruptException未被捕获而停止。也可利用取余运算%判断线程需要打印的字符,不用生成多个 Condition对象,可利用一个Condition对象,而且可以改变,随便多少个线程打印多少个字符。

daobuxinzi的博客 213

三个线程循环顺序打印

通过wait()/notiyf()来实现等待/通知模型,首先线程A获取锁后执行线程A中的打印逻辑,然后线程A调用了lock对象的notifyAll()方法进入释放lock对象,线程B获取到锁后执行线程B中的打印逻辑,然后线程B调用了lock对象的notifyAll()方法进入释放lock对象,线程C获取到锁后执行线程C中的打印逻辑,然后线程C调用了lock对象的notifyAll()方法进入释放lock对象。主要考虑的是线程间同步问题,可以通过线程间等待/通知模型来解决顺序性。本文由博客一文多发平台。

yangnk的技术记录 304

[Java] 多线程顺序打印的实现方法

更简单一些,并且LockSupport支持指定唤醒线程。

qq_40692756的博客 909

手撕面试题:多个线程交替打印问题

点击上方蓝色“方志朋”,选择“设为星标”回复“666”获取独家整理的学习资料!第一篇打算总结下阿里最喜欢问的多个线程顺序打印问题,我遇到的是机试,直接写出运行。同类型的题目有很多,比如三个...

方志朋的博客 218

wait,notify实现两个线程交替打印

package /** * Created by on 2017/10/10. */ public class ThreadTest { public static void main(String[] args) { final flag flag = new flag(); final AddPrint addPrint = new Ad

tanyunlong_nice的专栏 1318

用三个线程按顺序循环打印abc三个字母,比如abcabcabc(四种方式实现

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料。

m0_60707660的博客 1470

打印out of memory while expanding_手撕面试题:多个线程交替打印问题

点击蓝色“JavaKeeper”关注我哟加个“星标”,一起成长,做牛逼闪闪的技术人Keeper导读大家在换工作面试中,除了一些常规算法题,还会遇到各种需要手写的题目,所以打算总结出来,给大家个参考。全文 2929 字,剩下的是代码,P6 及以下阅读只需要 8 分钟,高 P 请直接关闭第一篇打算总结下阿里最喜欢问的多个线程顺序打印问题,我遇到的是机试,直接写出运行。同类型的题目有很多,比如...

weixin_39844963的博客 132
上一篇: 关于sychronized的使用
下一篇: 关于Volatile需要知道
周末的丢
博客等级 码龄7年 197粉丝 331原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值