在多线程中,当我们处理线程时,会出现暂停和启动线程的要求,为此线程提供了两种方法,分别用于等待和连接。
以下是wait()和join()之间的重要区别。
| 序号 | 键 | wait() | join() |
|---|---|---|---|
| 1 | Declaration | 在对象类中定义了wait()方法,因此在java.lang包中声明了wait()方法。 | 另一方面,join()方法也在java.lang包中但在Thread类中定义。 |
| 2 | Usage | wait()方法主要用于线程间的通信。 | 另一方面,join()用于在多个线程之间添加顺序,一个线程在第一个线程执行完成后开始执行。 |
| 3 | Counter method | 由于wait()方法用于暂停当前线程,因此在object类中也提供了它的counter方法来恢复notify()和notifyAll()线程。 | 另一方面,除非没有中断执行join的线程,否则我们无法打破join()方法所施加的等待。 |
| 4 | Context | 为了调用wait方法,我们需要synchronized块或方法,就像wait()方法在同步上下文外调用一样,它将抛出illegramonitorstateException。 | 另一方面,调用join()方法不需要这样的条件,我们可以在Java中在有或没有同步上下文的情况下调用join()方法。 |
| 5 | Lock Release | wait()释放调用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