Linux 拨号vps windows公众号手机端

Java中如何使用wait/notify实现线程间通信

lewis 5年前 (2020-07-21) 阅读数 9 #VPS/云服务器

本文目录导读:

  1. <"http://#id1" title="codewait()/code和codenotify()/code方法简介" "">wait()notify()方法简介
  2. <"http://#id2" title="使用codewait()/code和codenotify()/code实现线程间通信的步骤" "">使用wait()notify()实现线程间通信的步骤
  3. <"http://#id3" title="示例代码" "">示例代码

在Java中,线程间的通信是一个重要的概念,它允许线程之间共享数据和协调工作。wait()notify()方法是Java提供的用于线程间通信的重要机制,这两个方法通常与synchronized关键字一起使用,以确保线程安全。

wait()notify()方法简介

1、wait(): 此方法用于使当前线程等待,直到其他线程调用同一对象的notify()notifyAll()方法,当一个线程调用对象的wait()方法时,该对象会释放锁,从而使其他线程可以获取该对象的锁并访问其共享资源,当其他线程调用对象的notify()notifyAll()方法时,等待的线程将重新进入等待池,并重新获取对象的锁。

2、notify(): 此方法用于唤醒正在等待对象监视器的单个线程(即调用过wait()的线程),如果有多个线程在等待,则只唤醒其中一个线程。

使用wait()notify()实现线程间通信的步骤

1、确保共享资源被正确地声明为volatilesynchronized,以确保多线程访问时的可见性和互斥性。

2、在需要等待的线程中,调用对象的wait()方法,使当前线程进入等待状态。

3、在需要通知的线程中,调用对象的notify()notifyAll()方法,唤醒正在等待的线程。

4、确保在访问共享资源时使用适当的同步机制(如synchronized块或方法),以避免出现竞态条件。

示例代码

下面是一个简单的示例代码,演示如何使用wait()notify()实现线程间的通信:

public class Example {
    private int count = 0;
    private final Object lock = new Object();
    
    public void increment() {
        synchronized (lock) {
            while (count == 5) {
                try {
                    lock.wait(); // 当前线程等待,直到count不等于5或被其他线程唤醒
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 重新设置中断状态
                }
            }
            count++;
            lock.notifyAll(); // 唤醒所有等待的线程
        }
    }
    
    public void decrement() {
        synchronized (lock) {
            while (count == 0) {
                try {
                    lock.wait(); // 当前线程等待,直到count不等于0或被其他线程唤醒
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt(); // 重新设置中断状态
                }
            }
            count--;
            lock.notifyAll(); // 唤醒所有等待的线程
        }
    }
}

在上面的示例中,我们创建了一个名为Example的类,其中包含一个共享变量count和一个同步对象lock,两个方法increment()decrement()用于增加和减少count的值,在每个方法中,我们使用synchronized块来确保同一时间只有一个线程可以访问共享资源,如果count的值达到了5或0,当前线程会调用wait()方法进入等待状态,直到其他线程调用该对象的notifyAll()方法唤醒它,我们还处理了可能出现的中断异常。

版权声明

本文仅代表作者观点,不代表米安网络立场。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门