Java中的wait()和notify()方法是实现线程间通信的重要工具。wait()方法使线程等待,直到其他线程调用notify()或notifyAll()方法来唤醒它,而notify()方法则唤醒一个等待的线程。在本文中,我们将深入了解这两个方法的用法和原理,并通过代码示例来说明它们的作用。
wait()方法的用法和原理
wait()方法是Object类中的一个方法,可以在任何对象上调用。当一个线程执行wait()方法时,它会被阻塞,直到其他线程调用相同对象上的notify()或notifyAll()方法才能继续执行。
wait()方法有两种重载形式:
wait()
: 使当前线程等待,直到其他线程调用该对象的notify()或notifyAll()方法来唤醒它。wait(long timeout)
: 使当前线程等待指定的毫秒数,直到其他线程调用该对象的notify()或notifyAll()方法,或者超时时间到达。
wait()方法必须在同步块中调用,因为它会释放同步锁。这也是为什么wait()方法是Object类中的方法,因为任何对象都可以用作同步锁。
下面是一个示例代码,演示了wait()方法的用法:
class MyThread implements Runnable {
public void run() {
synchronized(this) {
try {
System.out.println("Thread " + Thread.currentThread().getId() + " is waiting...");
this.wait();
System.out.println("Thread " + Thread.currentThread().getId() + " is awake");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread1 = new Thread(myThread);
Thread thread2 = new Thread(myThread);
thread1.start();
thread2.start();
Thread.sleep(1000); // 等待1秒钟
synchronized(myThread) {
myThread.notify(); // 唤醒一个等待的线程
}
}
}
上述代码中,我们创建了一个MyThread类,它实现了Runnable接口。在run()方法中,我们使用synchronized关键字来同步代码块,并在同步块内部调用了wait()方法。在main()方法中,我们创建了两个线程并启动它们,然后等待1秒钟后调用notify()方法唤醒一个等待的线程。
notify()方法的用法和原理
notify()方法也是Object类中的一个方法,用于唤醒一个等待的线程。如果有多个线程在等待,那么只会唤醒其中一个线程,具体唤醒哪个线程是不确定的。
notify()方法有两种重载形式:
notify()
: 唤醒在该对象上等待的单个线程。notifyAll()
: 唤醒在该对象上等待的所有线程。
下面是一个示例代码,演示了notify()方法的用法:
class MyThread implements Runnable {
public void run() {
synchronized(this) {
System.out.println("Thread " + Thread.currentThread().getId() + " is running...");
this.notify();
}
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
MyThread myThread = new MyThread();
Thread thread1 = new Thread(myThread);
Thread thread2 = new Thread(myThread);
synchronized(myThread) {
thread1.start();
myThread.wait(); // 等待线程1唤醒
thread2.start();
}
}
}
上述代码中,我们创建了一个MyThread类,它实现了Runnable接口。在run()方法中,我们使用synchronized关键字来同步代码块,并在同步块内部调用了notify()方法来唤醒一个等待的线程。在main()方法中,我们创建了两个线程,并在同步块中先启动线程1,然后等待线程1唤醒后再启动线程2。
wait()和notify()的流程图
下面是wait()和notify()方法的基本流程图:
flowchart TD
A[线程
【文章原创作者:香港显卡服务器 http://www.558idc.com/hkgpu.html 网络转载请说明出处】