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