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

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

常见方法

sleep(long millis)

使当前正在执行的线程休眠(暂时停止执行)指定的毫秒数。时间未必精准,具体取决于系统计时器和调度程序的精度和准确性。

run()

run方法是线程的处理逻辑的方法

start()

启动线程的方法,java虚拟机会通过此方法调用run方法

notify()

调用某个对象的notify()方法能够唤醒一个正在等待这个对象的monitor的线程,如果有多个线程都在等待这个对象的monitor,则只能唤醒其中一个线程;

notifyAll()

调用notifyAll()方法能够唤醒所有正在等待这个对象的monitor的线程

wait()

使当前线程进入等待状态,需要另一个线程调用此对象的notify()或者调用notifyAll()



wait()和notify()分析

下面写个简单的demo来展示一下线程的wait()和notify()。

注意:wait()和notofy()必须在同步块中,否则将会抛出java.lang.IllegalMonitorStateException

public class MyThread extends Thread {
    static int i = 0;

    @Override
    public void run() {

        synchronized (this){

            System.out.println("累加计算");
            i += 100;
            System.out.println("唤醒此对象等待中的线程");
            this.notify();
        }


    }
}

class MyThreadTest {
    public static void main(String[] args) throws InterruptedException {

        MyThread myThread = new MyThread();
        myThread.start();

        // MyThreadTest的main线程取得了myThread线程的锁
        // 此时myThread线程就无法运行了
        synchronized (myThread) {
            System.out.println("myThread线程进入等待状态");
            myThread.wait();
            System.out.println("DONE,运算结果: i="+ MyThread.i );

        }


    }
}

运行结果:
myThread线程进入等待状态
累加计算
唤醒此对象等待中的线程
DONE,运算结果: i=100

分析:
打印出来的第一句是:myThread线程进入等待状态。证明myThread线程还未执行run方法,就已经被MyThreadTest的main方法锁住了线程实例。
正常情况下myThread线程是无法运行了,但是第二句却打印出了myThread.run方法信息。

由此可以看出wait()会释放对象的锁,MyThreadTest线程锁住了myThread,wait()释放了锁,myThread线程对象获得了锁并运行计算,通过notify()正在唤醒等待状态的myThread,MyThreadTest线程重新锁住了myThread,直至执行完毕。

notify()/notifyAll()并不是真正释放锁,必须等到synchronized方法或者语法块执行完才真正释放锁

等待状态线程对象被notify()唤醒后,需要重新由cpu调度获取锁

…

sleep()和wait()的区别

将以上例子中的wait()换成sleep()
运行结果:
myThread线程进入等待状态
DONE,运算结果: i=0
累加计算
唤醒此对象等待中的线程

由此可以看出,sleep并不会释放锁,是等待MyThreadTest的同步块执行完毕只会才运行myThread的run方法

Java多线程系列—线程通信机制wait notify notifyAll(03) 线程通信机制wait notify notifyAll 本课时我们主要学习 wait/notify/notifyAll 方法的使用注意事项。 我们主要从三个问题入手: 为什么 wait 方法必须在 synchronized 保护的同步代码中使用? 为什么 wait/notify/notifyAll 被定义在 Object 类中,而 sleep 定义在 Thread 类中? wait/notify 和 sleep 方法的异同? wait 必须在 synchronized 保护的同步代码中使用 为什么wai 阅读详情

相关推荐

掌握Java多线程:Wait、Notify与Sleep的区别

Java多线程编程是高级编程领域中至关重要的部分,它允许应用程序同时执行多个任务,以提高程序的效率和响应速度。Java提供了强大的线程同步机制来控制多个线程访问共享资源的情况,保证数据的一致性和线程的安全性。本章将详细介绍Java多线程同步机制的基础知识,为后续章节中深入探讨各种线程协作方法和使用场景打下坚实的基础。在Java多线程编程中,notify()和方法都是Object类中的公开方法,用于唤醒在此对象监视器上等待的单个或所有线程。

weixin_35754962的博客 1057

java thread一直 wait_Java 多线程 线程的五种状态,线程 Sleep, Wait, notify, notifyAll...

一、先来看看Thread类里面都有哪几种状态,在Thread.class中可以找到这个枚举,它定义了线程的相关状态:1 public enumState {2 NEW,3 RUNNABLE,4 BLOCKED,5 WAITING,6 TIMED_WAITING,7 TERMINATED;8 }具体解释请见源码,下面简单解释下Thread的五种状态什么时候出现:NEW 新建状态,线程创建且没有执行s...

weixin_32860759的博客 573

Python3.8下MvCameraControl.dll加载失败?3种方法彻底解决FileNotFoundError

本文针对Python3.8及以上版本在Windows平台调用MvCameraControl.dll时出现的FileNotFoundError问题,深入剖析了其根源在于Python 3.8引入的DLL加载安全机制变更。文章提供了三种核心解决方案:显式指定DLL完整路径、使用os.add_dll_directory()添加可信目录,以及利用ctypes的winmode参数进行精细控制,并给出了工程化封装建议,帮助开发者彻底解决此兼容性问题。

weixin_29093017的博客 191

Java学习之Thread之Join、【Monitor】与【wait】与【notify】与【sleep】_加【Callable】【Executor】【ExecutorService】【Future】

■基础 【相同点】 都会让线程进入阻塞(Blocked)状态 【不同的】 1.每一个Object对象,都有一个锁,【wait】会释放锁,【sleep】不会释放锁。(即,不会释放同步监视器) 详细解释 1.Monitor是一种用来实现同步的工具 (锁:【同步监视器】) 2.与每个java对象相关联,即每个java对象都有一个Monitor与之对应 3.Monitor是实现Sychronized(内置锁)的基础 2.【wait】与【notify】是Object的方法。【sleep】是Threa..

sun0322 5466

生信人的一天~HIFI数据+HIC数据组装基因组

HIFI+HIC数据组装基因组!

qq_43337286的博客 9530

MaxENT生态位模型实战:从数据准备到论文发表的完整指南

本文提供MaxENT生态位模型从数据准备到论文发表的完整实战指南,涵盖物种分布数据处理、环境变量筛选、参数优化及结果可视化等关键步骤。特别介绍如何通过R语言进行高级建模优化,提升模型AUC值,并分享海洋生物专题研究中的数据处理技巧。适合生态学研究者快速掌握这一强大的物种分布预测工具,产出高质量研究成果。

tensor9flow的博客 302

Java线程中sleep()、wait()和notify()和notifyAll()、yield()、join()等方法的用法和区别

[b]Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别[/b] 从操作系统的角度讲,os会维护一个ready queue(就绪的线程队列)。并且在某一时刻cpu只为ready queue中位于队列头部的线程服务。 但是当前正在被服务的线程可能觉得cpu的服...

深蓝色的忧伤 533

别再瞎改注册表了!实测Win10/Win11远程桌面60帧的正确姿势(附ToDesk对比)

本文深入解析Windows远程桌面60帧优化的科学方法,揭示常见误区并提供实测有效的解决方案。从版本差异到硬件加速,再到第三方工具对比(如ToDesk),帮助用户避开无效的注册表修改,实现流畅的远程桌面体验。

weixin_33738555的博客 343

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

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

wtopps的专栏 1万+

yolov7目标追踪:基于自定义数据集完成检测

目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2306

如何配置SSC CANopen的excel文件

如何配置 CANOpen 的 EXCEL 文件

PI_sunyang的博客 3700

【线程间通信】sleep/wait/notify/notifyAll作用及使用

wait和notify都要先获取到锁才能使用。获取到锁后,使用wait,线程会先释放锁对象,然后阻塞等待;使用notify,会通知在同一个锁对象上等待的线程,如果当前有多个线程在等待同一个锁对象,会随机唤醒一个等待的线程;而notifyAll,是所有线程都唤醒,这些线程再一起竞争锁。

qq_39666711的博客 1177

【TCN回归预测】TCN时间卷积神经网络数据回归预测(多输入单输出)【含Matlab源码 2317期】

TCN时间卷积神经网络数据回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版)或下载付费资源,可赠送奶茶价版付费专栏指定代码1份; 822

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

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

VIBE的博客 4249

CQE和SQE 以及 PQA和DQA的区别

‌:PQA聚焦产品全生命周期流程管理,DQA专注于设计阶段的质量控制。

a1809032425的博客 1904

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【Java多线程编程】wait与notify方法详解

本期讲解:Java 多线程中的 wait方法、notify方法、notifyAll方法,wait方法与sleep方法之间的区别。

我的主页 4496

jre9下载 jdk9

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

【Java多线程】wait方法和notify方法

介绍wait方法和notify方法

chaodddddd的博客 1427

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

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

计算机控制技术及应用

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

wait 和 notify、wait 和 sleep

wait() notify() sleep()

2302_77459644的博客 1012

为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中,wait/notify和sleep方法的异同

为什么wait/notify/notifyAll被定义在Object类中,而sleep定义在Thread类中 因为java中每个对象都有一把称之为monitor监控器的锁 由于每个对象都可以上锁,这就要求在对象头中有一个用来保存锁信息的位置 这个锁是对象级别多大,而非线程级别的,wait/notify/notifyAll也都是锁级别的操作, 他们的锁属于对象 所以把他们定义在Object类中最合适,因为Objecct类是所有对象的父类 因为如果把wait/notify/notifyAll方法定义在Thre

4816

【多线程】 Sleep、Wait、notify、notifyAll方法讲解

前言: sleep(1000) 是 Thread 中的方法,参数是sleep多少毫秒。sleep() 的作用是将当前线程暂停一段时间,但这期间不会释放锁 wait、notify、notifyAll 是 Object 中的方法,可以作用于任何对象,用于控制线程的状态,通常配合 synchronized 代码块使用 Sleep(): sleep 的作用是使当前线程睡眠指定的时间,放弃对CPU的占...

张井天的博客 1050

线程常用方法你了解吗(sleep、wait、notify、notifyAll)

void wait(long timeout, int nanos): 调用者线程等待指定时间,直到其他线程为此线程调用 notify 方法或 notifyAll 方法,或者其他线程中断当前线程,方法提供了一个 nanos 值更好的控制等待的时间,但是根据源码来看,其实并没有真正使用这个值。让线程休眠指定的时间,时间到了线程将会恢复执行,需要注意的是 sleep 方法会让线程让出 cpu 时间片,但是不是释放持有的锁,如果持有锁对象的线程调用了 sleep 方法,那其他线程一样得不到这个锁对象。

weixin_42118323的博客 1247

wait()方法和notify()方法

由于操作系统对线程的调度是随机执行的,且线程之间是抢占式执行的,因此线程之间执行的先后顺序难以预知。但是,有时候在实际开发中,我们希望合理的协调多个线程之间的先后执行顺序。在Java中,wait()方法和notify()方法就是解决该问题的。

2302_80826557的博客 1118

Java多线程-Thread的Object类介绍【wait】【notify】【sleep】

sleep方法可以让线程进入waiting状态,不占用CPU资源,但是不释放锁,规定时间之后再运行休眠期间如果被打断,会抛出异常并清除中断状态。

jx的博客 888

【Java|多线程与高并发】wait和notify方法详解

在Java多线程环境中,线程之间是抢占式执行的,线程的调度是随机的.这就很难受了. 在很多情况下我们希望线程以我们想要的顺序来执行. 这就需要wait和notify这两个方法wait和notify方法用于实现线程间的协作和通信.wait方法使线程进入等待状态,notify方法唤醒一个等待线程,notifyAll方法唤醒所有等待线程。通过上述三个方法,可以使线程按照特定的顺序执行或者等待某个条件满足后再执行。希望这篇文章能帮到你!专栏:《从零开始的Java学习之旅》在不断更新中,欢迎订阅!

云泽野の编程日记 1777

android 中wait notify 的使用,及wait与sleep区别

sleep和wait的区别有: 1,来自的类不同,sleep方法来自Thread,wait方法来自Object 2,sleep方法是线程内部方法,没有释放对象的锁,而wait方法释放了对象锁,使得其他线程可以使用同步控制块或者方法。 3,wait,notify和notifyAll是对象操作方法,必须在同步下进行,只有在synchronized里面使用,而sleep可以在任何地方使用。sync

幸福的小金火 7506

Java多线程中的 wait() 和 notify() 方法

多线程并发的场景下,有时需要某些线程先执行,这些线程执行结束后其他线程再继续执行, wait()和notify()是Object类的方法,用于线程的等待与唤醒,必须搭配synchronized 锁来使用。

sinat_31583645的博客 4351
上一篇: java多线程系列(一):Thread、Runnable、Callable实现多线程的区别
Qiu7
博客等级 码龄10年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值