当前位置: 代码迷 >> 综合 >> Thread-Wait
  详细解决方案

Thread-Wait

热度:96   发布时间:2023-09-19 17:55:46.0

实例

package com.example.demo.thread;public class WaitTest {
    public static Object lock = new Object();public static void main(String[] args) throws InterruptedException {
    WaitThread1 waitThread1 = new WaitThread1();WaitThread2 waitThread2 = new WaitThread2();WaitThread3 waitThread3 = new WaitThread3();waitThread1.setName("waitThread1");waitThread1.start();waitThread2.setName("waitThread2");waitThread2.start();waitThread3.setName("waitThread2");waitThread3.start();}}class WaitThread1 extends Thread {
    public void run() {
    synchronized (WaitTest.lock) {
    System.out.println("start" + Thread.currentThread().getName());try {
    WaitTest.lock.wait();} catch (InterruptedException e) {
    e.printStackTrace();}}System.out.println("end" + Thread.currentThread().getName());
// Thread.sleep(2000);System.out.println("WaitThread1");}
}class WaitThread2 extends Thread {
    public void run() {
    synchronized (WaitTest.lock) {
    System.out.println("start" + Thread.currentThread().getName());try {
    WaitTest.lock.wait();} catch (InterruptedException e) {
    e.printStackTrace();}}System.out.println("end" + Thread.currentThread().getName());System.out.println("WaitThread2");}
}class WaitThread3 extends Thread {
    public void run() {
    synchronized (WaitTest.lock) {
    System.out.println("start" + Thread.currentThread().getName());
// WaitTest.lock.notify();
// WaitTest.lock.notify(); // 如果只调用一次notify()那么只有一个线程会继续执行WaitTest.lock.notifyAll(); // 所有持有WaitTest.lock的线程都会重新到就绪态}System.out.println("end" + Thread.currentThread().getName());System.out.println("WaitThread3");}
}

输出

startwaitThread1
startwaitThread2
startwaitThread2
endwaitThread2
endwaitThread2
WaitThread2
endwaitThread1
WaitThread1
WaitThread3

从输出结果看,wait会释放锁,并等待唤醒,notify()会导致线程重新进入就绪态,notifyAll()会将所有持有当前锁的线程编程就绪态

  相关解决方案