你应该知道的wait/notify那点事儿

本文深入探讨了Java中wait/notify方法的使用,包括为何必须在同步块中调用、wait后的线程状态、异常处理、唤醒机制以及对系统性能的影响。通过分析线程状态和JVM源码,揭示了wait/notify在多线程通信中的工作原理。
摘要由CSDN通过智能技术生成

在Java的Object类中有2个我们不怎么常用(框架中用的更多)的方法:wait()与notify()或notfiyAll(),这两个方法主要用于多线程间的协同处理,即控制线程之间的等待、通知、切换及唤醒。

首先了解下线程有哪几种状态,Java的Thread.State中定义了线程的6种状态,分别如下:

  1. NEW 未启动的,不会出现在dump文件中(可以通过jstack命令查看线程堆栈)
  2. RUNNABLE 正在JVM中执行的
  3. BLOCKED 被阻塞,等待获取监视器锁进入synchronized代码块或者在调用Object.wait之后重新进入synchronized代码块
  4. WAITING 无限期等待另一个线程执行特定动作后唤醒它,也就是调用Object.wait后会等待拥有同一个监视器锁的线程调用notify/notifyAll来进行唤醒
  5. TIMED_WAITING 有时限的等待另一个线程执行特定动作
  6. TERMINATED 已经完成了执行

从操作系统层面上来讲,一个进程从创建到消亡期间,最常见的进程状态有以下几种
新建态 : 从程序映像到进程映像的转变,还没有加入到就绪队列中
就绪态 : 进程运行已万事俱备,正等待调度执行
运行态 : 进程指令正在被执行
阻塞态 : 进程正在等待一个时间操作完成,例如I/O操作
完成态 : 进程运行结束,它的资源已经被释放,供其他活动进程使用

接下来我们分析下面的代码

public class WaitNotify {
   

  public static void main(String[] args) {
   

    Object lock = new Object();
    
    // thread1
    new Thread(() -> {
   

        System.out.println("thread1 is ready");

        try {
   
            Thread.sleep(2000);
        } catch (InterruptedException e) {
   

        }
        synchronized (lock) {
   
            lock.notify
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值