多线程:搞懂 wait() 和 join()的关系

您所在的位置:网站首页 java多线程和python多线程的区别 多线程:搞懂 wait() 和 join()的关系

多线程:搞懂 wait() 和 join()的关系

2024-07-11 22:16| 来源: 网络整理| 查看: 265

多线程:搞懂 wait() 和 join()的关系

前置知识:线程状态 public enum State { NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED; } NEW (初始): 新创建线程对象,但还没有调用 start() 方法 RUNNABLE (运行): java 把 就绪 (ready) 和运行 (running) 一起归属于runnable。线程对象创建后,被其它的线程(如: main线程)调用start() 方法。该线程就处于就绪(ready)状态进入可运行线程池中,等待cpu线程调度。就绪状态的线程获得cpu时间片后变为 运行状态 (running) BLOCKED (阻塞) : 线程阻塞于锁 WAITING(等待) : 线程等待其它线程唤醒 TIMED_WAITING (超时等待) : 该状态不同于WAITING,它可以在指定的时间后自行返回。 TERMINATED (终止) :该线程执行完毕

在这里插入图片描述

wait() 详解

wait() notify() notifyAll() 都是 Object类的方法,使用这三个方法的前提是先获得该对象的锁。

调用 wait 方法后,释放持有的对象锁,线程状态有 Running 变为 Waiting,并将当前线程放置到对象的 等待队列; 调用notify 或者 notifyAll 方法后,等待线程依旧不会从 wait 返回,需要调用 noitfy 的线程释放锁之后,等待线程才有机会从 wait 返回; notify 方法:将等待队列的一个等待线程从等待队列种移到同步队列中 , notifyAll 方法:将等待队列种所有的线程全部移到同步队列,被移动的线程状态由 Waiting 变为 Blocked。

等待队列(等待池) 同步队列(锁池)

同步队列(锁池):假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的同步队列(锁池)中,这些线程状态为Blocked。

等待队列(等待池):假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时 线程A就进入到了该对象的等待队列(等待池)中,此时线程A状态为Waiting。如果另外的一个线程调用了相同对象的notifyAll()方法,那么 处于该对象的等待池中的线程就会全部进入该对象的同步队列(锁池)中,准备争夺锁的拥有权。如果另外的一个线程调用了相同对象的notify()方法,那么 仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的同步队列(锁池)。

深入join()

join() : 保证线程的执行顺序

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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3