Java wait和join方法之间的区别

在多线程中,当我们处理线程时,会出现暂停和启动线程的要求,为此线程提供了两种方法,分别用于等待和连接。

以下是wait()和join()之间的重要区别。

序号wait()join()
1Declaration在对象类中定义了wait()方法,因此在java.lang包中声明了wait()方法。另一方面,join()方法也在java.lang包中但在Thread类中定义。
2Usagewait()方法主要用于线程间的通信。另一方面,join()用于在多个线程之间添加顺序,一个线程在第一个线程执行完成后开始执行。
3Counter method由于wait()方法用于暂停当前线程,因此在object类中也提供了它的counter方法来恢复notify()和notifyAll()线程。另一方面,除非没有中断执行join的线程,否则我们无法打破join()方法所施加的等待。
4Context为了调用wait方法,我们需要synchronized块或方法,就像wait()方法在同步上下文外调用一样,它将抛出illegramonitorstateException。另一方面,调用join()方法不需要这样的条件,我们可以在Java中在有或没有同步上下文的情况下调用join()方法。
5Lock Releasewait()释放调用wait的对象上的监视器或锁另一方面,调用join()方法不会释放任何监视器或锁定。

wait() vs 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