【Java多线程】wait(),sleep(),notify()和notifyAll()方法详解

多线程中wait()、sleep()、notify()和notifyAll()方法异同点【面试】 现在面试基本上都会被问及到多线程,就有很高概率问到wait() 和 sleep() 这两者的区别 1、wait()、sleep() 方法相同点 (1)都是对线程的操作; (2)都需要抛异常; (这一点我遇到很多人答错,记住这两者都会抛异常) (3)都会让当前运行线程进入阻塞状态。 2、wait()、sleep() 方法不同点 (1)使用位置不同: wait() 方法必须在同步代码中,sleep() 则不需要; (2)申明位置不同: wait() 方法是 Object类 中的方法,sleep() 方法是 T. 阅读详情

  sleep()是线程类(Thread)的方法,导致此线程暂停执行指定的时间,到时后会自动恢复,调用sleep()不会释放对象锁。 sleep()方法是正在执行的线程主动让出CPU。wait()是Object类的方法,对此对象调用wait()方法导致本线程放弃对象锁,进入对象的等待锁定池,只有当此对象调用notify()方法(或notifyAll())后,本线程才进入对象锁定池准备获得对象锁进入运行状态。notifyAll()是Object类的方法,其作用是唤醒在此对象监视器上等待的所有线程。具体可参考以下代码:

public class MultiThread {
    public static void main(String[] args) {
        new Thread(new SubThread1()).start();
        try {
            Thread.sleep(10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(new SubThread2()).start();
    }

    private static class SubThread1 implements Runnable {
        public void run() {
            synchronized (MultiThread.class) {
                System.out.println("Enter SubThread1>>>>>>>>>>>>>>>>>>>>>>");
                System.out.println("SubThread1 is waiting>>>>>>>>>>>>>>>>>");
                try {
                    //wait()会释放锁,本线程会进入等待锁定池
                    /*此时运行结果:
                    Enter SubThread1>>>>>>>>>>>>>>>>>>>>>>
                    SubThread1 is waiting>>>>>>>>>>>>>>>>>
                    Enter SubThread2>>>>>>>>>>>>>>>>>>>>>>
                    SubThread2 notify other thread can release wait status..
                    SubThread2 is sleeping ten millisecond...
                    SubThread2 is going on.
                    SubThread1 is going on.*/
//                    MultiThread.class.wait();

                    //sleep()不会释放锁
                    /*此时运行结果:
                    Enter SubThread1>>>>>>>>>>>>>>>>>>>>>>
                    SubThread1 is waiting>>>>>>>>>>>>>>>>>
                    SubThread1 is going on.
                    Enter SubThread2>>>>>>>>>>>>>>>>>>>>>>
                    SubThread2 notify other thread can release wait status..
                    SubThread2 is sleeping ten millisecond...
                    SubThread2 is going on.*/
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("SubThread1 is going on.");
            }
        }
    }

    private static class SubThread2 implements Runnable {
        public void run() {
            synchronized (MultiThread.class) {
                System.out.println("Enter SubThread2>>>>>>>>>>>>>>>>>>>>>>");
                System.out.println("SubThread2 notify other thread can release wait status..");
                //notify()不会释放锁,当本同步代码块执行结束,别的线程才有可能执行
                MultiThread.class.notify();
                System.out.println("SubThread2 is sleeping ten millisecond...");
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("SubThread2 is going on.");
            }
        }
    }
}

引申

  利用wait()和notify()实现生产者消费者模型
  生产者代码:

import java.util.Queue;
import java.util.Random;

/**
 * @author Katakuly
 * @date 2019/7/11
 */
public class Producer implements Runnable {
    private Queue<Integer> queue;
    private int maxSize;

    public Producer(Queue<Integer> queue, int maxSize) {
        this.queue = queue;
        this.maxSize = maxSize;
    }

    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            synchronized (queue) {
                while (queue.size() == maxSize) {
                    try {
                        System.out.println("Queue is Full");
                        queue.wait();
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }
                }
                Random random = new Random();
                int j = random.nextInt();
                System.out.println("Produce " + j);
                queue.add(j);
                queue.notifyAll();
            }
        }
    }
}

消费者代码:

import java.util.Queue;

/**
 * @author Katakuly
 * @date 2019/7/11
 */
public class Consumer implements Runnable {

    private Queue<Integer> queue;
    private int maxSize;

    public Consumer(Queue<Integer> queue, int maxSize) {
        this.queue = queue;
        this.maxSize = maxSize;
    }

    @Override
    public void run() {
        for (int i = 0; i < 6; i++) {
            synchronized (queue) {
                while (queue.isEmpty()) {
                    System.out.println("Queue is Empty");
                    try {
                        queue.wait();
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    }
                }
                int v = queue.remove();
                System.out.println("Consume " + v);
                queue.notifyAll();
            }
        }
    }
}


主程序:

import java.util.LinkedList;
import java.util.Queue;

/**
 * @author Katakuly
 * @date 2019/7/11
 */
public class Solution {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        int maxSize = 10;
        Producer producer = new Producer(queue, maxSize);
        Consumer consumer = new Consumer(queue, maxSize);
        Thread producerThread = new Thread(producer);
        Thread consumerThread = new Thread(consumer);
        producerThread.start();
        consumerThread.start();
    }
}

  本例设定生产者生产了三个对象,而消费者需要消费六个对象,所以在三个对象消费完之后,剩下的消费者消费对象只能是空,如果想不断的生产消费,可将for()循环修改成while(true)。如下是运行结果:

Produce 1745693584
Produce 894010005
Produce 2090675163
Consume 1745693584
Consume 894010005
Consume 2090675163
Queue is Empty
从零到一:手把手教你用海康VisionMaster完成第一个字符识别项目(附完整流程与避坑点) 本文详细介绍了如何使用海康VisionMaster完成首个字符识别项目,涵盖从环境搭建、图像预处理到系统集成的完整流程。特别分享了Blob分析配置、字符识别优化等实战技巧,帮助开发者避开常见陷阱,快速掌握VisionMaster的基本操作,提升工业自动化场景下的字符识别效率。 阅读详情

相关推荐

阿里开源最强数字人工具 EchoMimicV2,本地部署(一)

EchoMimicV2是阿里推出的半身人体AI数字人项目,基于参考图片、音频剪辑和手部姿势序列生成高质量动画视频,确保音频内容与半身动作的一致性。现在本地部署,安装体验一下。

缘分天空的专栏 4614

Java并发07:Thread的基本方法(4)-Thread.sleep()、Object.wait()、notify()和notifyAll()

[超级链接:Java并发学习系列-绪论] 本章主要对Java中Thread类的基本方法进行学习。 1.序言 Thread类作为线程的基类,提供了一系列方法,主要有: Thread.sleep(long):强制线程睡眠一段时间。 Thread.activeCount():获取当前程序中存活的线程数。 thread.start():启动一个线程。 Thread.currentThread()...

韩超的博客 (hanchao5272) 1601

别再只盯着内存溢出了!从Unity崩溃日志中揪出AssetBundle.LoadAsset_Internal的真凶

本文深入解析Unity崩溃日志中AssetBundle.LoadAsset_Internal错误的真实原因,帮助开发者超越内存溢出的表象,识别文件损坏、热更新陷阱等核心问题。通过日志分析技巧、最佳实践和高级调试方法,提供系统化的解决方案,确保Unity资源加载的稳定性。

weixin_42676824的博客 250

多线程中的等待唤醒机制wait()、notify()、sleep()方法详解(含底层工作原理及代码实现)

1.线程的工作状态 (图源:网课视频) 注意:(1)在使用了同步方法的线程中,获得锁对象的线程处于运行状态(RUNABLE),而其余争夺锁对象的线程处于阻塞状态。一旦拥有锁对象的线程释放了该锁,那么它就会重新进入线程池和其他线程一块争夺锁对象,而获得锁对象的线程将由阻塞状态(BLOCKED)进入运行状态。 (2)计时等待:线程对象调用Object.wait()、Thread.sleep()方法会使自身进入睡眠状态从而退出运行的状态,内部参数为用户想要等待的毫秒值(ms) (3)等待:线程对象调用

m0_56603583的博客 2247

【寄存器模型】二、前门访问与后门访问

1.后门访问可以更好的完成前门访问能够完成的事情:后门访问不消耗仿真时间,且消耗的运行时间也远小于前门访问的运行时间。 2.后门访问可以完成前门访问不能完成的事:对于某些特定的场景,如网络通信系统中的一些只读计数器,当要验证计数器进位归零的场景时,前门访问无法完成写寄存器操作,只能通过消耗仿真时间来使计数器到达特定的计数值。而后门访问可以直接对只读寄存器赋一个初值......

carrotbanana的博客 9657

光通量与辐射通量之间的换算

由理论和实验可知存在两种定义: 1W1W1W(瓦特)的频率为540×1012Hz540\times10^{12}Hz540×1012Hz(赫兹)的单色辐射的辐射通量等于683lm(流明)683lm(流明)683lm(流明).。 1lm1lm1lm的频率为540×1012Hz540\times10^{12}Hz540×1012Hz的单色通量等于1683=0.001464W\frac{1}{683}=0.001464W6831​=0.001464W。 从上述定义中我们可以得到什么呢?我们知道光速: c=3×

u011699626的博客 3273

java并发之sleep与wait、notify与notifyAll的区别

wait()方法的意思是持有该锁对象的线程对象进入wait状态:释放锁,然后将当前线程放入等待池中。 sleep()的作用是将当前线程暂停一定的时间,但在这期间并不释放锁。 notify()会在等待池中随机选择一个线程对象放入锁池中。而notifyAll会将所有等待该锁的线程放入锁池中。

sanmianti 2472

YOLOv13改进策略【Head】| 引入RT-DETR中的RTDETRDecoder,替换检测头

本文记录的是基于RTDETRDecoder模块的YOLOv13目标检测改进方法研究。RT-DETR的模块通过,能为解码器提供高质量的初始,从而。相比v13原始的检测头,RT-DETR能,替换后能够更好的提高模型性能。

Limiiiing的博客 434

聊聊并发:(三)wait、sleep、notify、notifyAll分析

前言 在上一篇中,我们介绍了Java中的线程的基本概念,我们了解到线程是有很多种状态的,本章,我们就来聊聊线程中的状态是如何进行控制与切换的。Java中提供了很多种方法对线程的状态进行控制以及线程之间的通信,包括wait、notify、notifyAll、sleep,下面我们就来看一下它们之间有什么区别,以及如何使用这些方法进行线程状态的控制与通信。 线程之间的通信 在Java中可以用w...

wtopps的专栏 1万+

初学者入门YOLO目标检测:从懵圈到上手,这篇文章讲透所有核心(附学习路径+避坑指南)

目标:比如训练一个“检测苹果和橘子”的模型,或者“检测人脸”的模型;任务:学会用LabelImg标注数据,制作YOLO格式的数据集,用命令行训练模型;关键:不用追求高精度,能训练出一个能检测出目标的模型就行。很多初学者卡在入门阶段,不是因为智商不够,而是因为“想太多,做太少”——总觉得要把所有原理搞懂才能动手,结果越想越怕,最后放弃。先动手,再动脑。先跑通一个案例,获得成就感;再制作自定义数据集,训练简单模型;最后再回头去理解原理,优化模型。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 690

SAP公司间STO业务解析(包含主数据解析、后台配置解析、前台业务演示)

SAP公司间STO业务解析

ww114784的博客 1018

java多线程系列(二):Thread的常用方法讲解(sleep、wait、notify)

常见方法 sleep(long millis) 使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数。时间未必精准,具体取决于系统计时器和调度程序的精度和准确性。 run() run方法是线程的处理逻辑的方法 start() 启动线程的方法,java虚拟机会通过此方法调用run方法 notify() 调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线...

github_38625280的博客 348

VS2019编译使用log4cplus 1.2.0

logger.properties 文件。第三步,创建项目来测试,配置库。第二步,使用VS2019编译。

h a 6 6 6 c k 为 你解决复杂难题! 528

Java多线程的wait(),notify(),notifyAll()、sleep()和yield()方法使用详解

Java多线程中的wait(),notify(),notifyAll()、sleep()和yield()方法 我们先从一个案例开始: static public class WaitingTest { //static创建静态对象,确保是同一个monitor对象 static Object obj = new Object(); public static void main...

yZzc_XQ的博客 236

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java yied的用法,Java多线程的wait(),notify(),notifyAll()、sleep()和yield()方法使用详解,...

Java多线程的wait(),notify(),notifyAll()、sleep()和yield()方法使用详解,Java多线程中的wait(),notify(),notifyAll()、sleep()和yield()方法我们先从一个案例开始:static public class WaitingTest {//static创建静态对象,确保是同一个monitor对象static Object ...

weixin_39960019的博客 439

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

[sleep(),join(),yield()方法] [wait(),notify()/notifyAll()]

549

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java 多线程之Thread类的常用方法及线程调度优先级等

Java 多线程之Thread类的常用方法1.Thread类常用方法2. 线程通信:wait() notify() notifyAll()3.线程的调度1. 调度策略2.Java的调度方法3.线程的优先级4.Demo 1.Thread类常用方法 start():启动线程并执行相应的run()方法 run():子线程要执行的代码放入run()方法中 currentThread():静态的,调取当前...

码农回顾 799

Java多线程整理3-通信、对象的等待集wait set-多线程案例

Java多线程整理3-通信、对象的等待集wait set-多线程案例多线程整理31. 通信、对象的等待集wait set1.1 wait()方法1.2 notify()方法1.3 notifyAll()方法1.4 wait 和 sleep 的对比2. 多线程案例2.1 单例模式2.1.1 饿汉模式2.1.2 懒汉模式-单线程版(延迟加载)2.1.3 懒汉模式-多线程版-性能低2.1.4 懒汉模式-多线程版-二次判断-性能高2.2 阻塞式队列2.2.1 Java提供的阻塞队列2.2.2 阻塞队列实现2.3 定

Madrid-7的博客 435

java多线程和Python多线程

Java多线程 Java多线程的生命周期及五种基本状态 如图所示: 线程的状态: 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调

@李文杰的博客 1980

多线程学习---线程通信

线程的通信案例:两个线程交替打印1-100的数 /** * 线程通信例子两个线程打印1-100, 线程1,线程2交替打印 * @author ycr * @date 2021/1/19 */ public class CommunicationDemo { public static void main(String[] args) { Number number = new Number(); Thread t1 = new Thread(number,

qq_42618152的博客 61

Java中 notify/notifyAll、run/start、wait/sleep、有啥区别

wait()方法是Object类中定义的一个方法,它的作用是使当前线程进入等待状态,直到其他线程调用notify()或notifyAll()方法唤醒它。在消费者线程中,调用message.consume()方法消费消息,并通过notifyAll()方法唤醒等待中的生产者和消费者线程。在生产者线程中,调用message.produce()方法生产消息,并通过notify()方法唤醒等待中的消费者线程。在Java中,notify和notifyAll是用于线程间通信的方法,用于唤醒等待中的线程。

qq_39939541的博客 600

Java多线程wait()和notify()方法图解

多线程场景下 wait 和notify 方法详解,注意事项,内部阻塞队列和等待队列的过程,wait和sleep方法的区别

VIBE的博客 4249

多线程sleep()和wait()的区别

Java多线程是一种抢占式的机制,线程主要有以下几种状态:可运行,运行,阻塞,死亡。抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行。当有多个线程访问共享数据的时候,就需要对线程进行同步。每个对象都有一个机锁来控制同步访问。Synchronized关键字可以和对象的机锁交互,来实现线程的同步。线程中的几个主要方法的比较: Thread类的方法:sleep(),yi...

摸金校尉的博客 2万+

Java线程同步与通信:wait(), notify(), notifyAll(), sleep()

Java提供了几种核心方法来实现线程间的同步与通信,主要包括`wait()`, `notify()`, `notifyAll()`, 以及`sleep()`。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 6206

【JavaEE初阶 — 多线程】wait() & notify()

wait() & notify()

OuO-1 的博客 1813

wait(), notify(), notifyAll(),join(),sleep(),yield()等方法介绍

一.概述 本篇文章会对线程等待/唤醒方法进行介绍。涉及到的内容包括:1. wait(), notify(), notifyAll(),join(),sleep(),yield()等方法介绍 2. wait()和notify() 3. wait(long timeout)和notify() 4. wait() 和 notifyAll() 5.wait()和join() 6. 为...

zhaojun20161206的博客 2933
上一篇: 【Java基础】hashCode()方法和equals()方法的作用
下一篇: 经典55句
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值