📜  Javawait()和join()方法的区别(1)

📅  最后修改于: 2023-12-03 15:16:19.106000             🧑  作者: Mango

Java中wait()和join()方法的区别

介绍

Java中提供了一些线程控制方法,包括wait()join()方法。这两个方法都可以让线程等待其他线程执行完毕后再继续执行。然而,它们也有一些不同之处。

wait()方法

wait()方法是定义在Object类中的方法,它允许一个线程等待另一个线程的通知。使用wait()方法时,当前线程会释放锁,并进入阻塞状态,直到其他线程调用了notify()notifyAll()方法,或者超时时间到了。

join()方法

join()方法是定义在Thread类中的方法,它允许一个线程等待另一个线程执行完毕后再继续执行。使用join()方法时,当前线程会等待调用join()方法的线程执行完毕,才会继续执行。

区别

从上面的介绍可以看出,wait()join()方法都可以让一个线程等待其他线程执行完毕后再继续执行,但它们的使用场景和实现方式有所不同。

  • 使用场景:wait()方法一般用于线程间的通信,即一个线程需要等待另一个线程的某个条件满足后再继续执行。join()方法一般用于主线程等待子线程执行完毕后再继续执行。
  • 实现方式:wait()方法会释放锁,让其他线程有机会执行;join()方法会一直等待被调用的线程执行完毕,不会释放锁。

下面是使用wait()join()方法的示例代码:

public class WaitTest {

    private static final Object lock = new Object();

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("t1 start");
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("t1 end");
            }
        });

        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("t2 start");
                lock.notifyAll();
                System.out.println("t2 end");
            }
        });

        t1.start();
        Thread.sleep(1000);
        t2.start();
    }
}

上面的代码中,使用wait()方法让t1线程等待其他线程调用lock.notifyAll()方法,才会继续执行。使用join()方法让主线程等待子线程t执行完毕后再继续执行:

public class JoinTest {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            System.out.println("t start");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("t end");
        });
        t.start();

        System.out.println("main thread start");
        t.join();
        System.out.println("main thread end");
    }
}

上面的代码中,使用join()方法让主线程等待子线程t执行完毕后再继续执行。