Java 中 wait() 和 join() 方法之间的区别

java 8object oriented programmingprogramming更新于 2024/11/8 9:34:00

在多线程中,当我们处理线程时,需要暂停并启动一个线程,为此,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

相关文章