在多线程中,当我们处理线程时,会出现暂停和启动线程的要求,为此线程提供了两种方法,分别用于等待和连接。
以下是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