📅  最后修改于: 2023-12-03 15:16:19.106000             🧑  作者: Mango
Java中提供了一些线程控制方法,包括wait()
和join()
方法。这两个方法都可以让线程等待其他线程执行完毕后再继续执行。然而,它们也有一些不同之处。
wait()
方法是定义在Object
类中的方法,它允许一个线程等待另一个线程的通知。使用wait()
方法时,当前线程会释放锁,并进入阻塞状态,直到其他线程调用了notify()
或notifyAll()
方法,或者超时时间到了。
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
执行完毕后再继续执行。