Java 中 wait() 和 join() 方法之间的区别
java 8object oriented programmingprogramming更新于 2025/11/25 17:16:17
在多线程中,当我们处理线程时,需要暂停并启动一个线程,为此,Threading 提供了两种用于相同目的的方法 wait 和 join。
以下是 wait() 和 join() 之间的重要区别。
| Sr.不。 | 关键 | wait() | join() |
|---|---|---|---|
| 1 | 声明 | wait() 方法在 Object 类中定义,因此 wait() 方法在 java.lang 包中声明。 | 另一方面,join() 方法也在 java.lang 包中定义,但在 Thread 类中。 |
| 2 | 用法 | wait() 方法主要用于线程间通信。 | 另一方面,join() 用于在多个线程之间添加排序,一个线程在第一个线程执行完成后开始执行。 |
| 3 | 计数器方法 | 由于 wait() 方法用于暂停当前线程,因此对象类中也提供了它的计数器方法以恢复线程,即 notify() 和 notifyAll()。 | 另一方面,除非或中断调用 join 的线程已经完成执行,否则我们无法打破 join() 方法施加的等待。 |
| 4 | 上下文 | 为了调用 wait 方法,我们需要同步块或方法,因为如果在同步上下文之外调用 wait() 方法,它将抛出 IllegalMonitorStateException。 | 另一方面,调用 join() 方法不需要这样的条件,我们可以在 Java 中使用或不使用同步上下文来调用 join() 方法。 |
| 5 | 锁释放 | wait() 释放在调用 wait 的对象上持有的监视器或锁 | 另一方面,调用 join() 方法不会释放任何监视器或锁。 |
wait() 与 join() 的示例
JavaTester.java
public class JavaTester extends Thread {
static Object lock = new Object();
static int n;
int i;
String name;
JavaTester(String name, int i) {
this.name = name;
this.i = i;
}
@Override
public void run() {
try {
synchronized (lock) {
while (i != n) {
lock.wait();
}
System.out.println(name + " started");
n++;
lock.notifyAll();
}
synchronized (lock) {
while (i != n - 4) {
lock.wait();
}
System.out.println(name + " finished");
n++;
lock.notifyAll();
}
}
catch (InterruptedException e) {
}
}
public static void main(String[] args) throws Exception {
new JavaTester("a", 0).start();
new JavaTester("b", 1).start();
new JavaTester("c", 2).start();
new JavaTester("d", 3).start();
}
}
输出
a started b started c started d started a finished b finished c finished d finished

