当前位置 : 主页 > 编程语言 > java >

Java多线程:等待唤醒机制

来源:互联网 收集:自由互联 发布时间:2023-12-28
在Java中,多线程的等待唤醒机制是一种非常重要的同步机制,它可以让线程之间相互协作,确保多个线程能够正确地共享资源,避免数据不一致和线程冲突等问题。 等待唤醒机制主要

在Java中,多线程的等待唤醒机制是一种非常重要的同步机制,它可以让线程之间相互协作,确保多个线程能够正确地共享资源,避免数据不一致和线程冲突等问题。

等待唤醒机制主要包括两个操作:等待(wait)和唤醒(notify)。在Java中,这两个操作都是由Object类提供的,因此任何Java对象都支持等待唤醒机制。

一、等待操作

等待操作是通过调用对象的wait()方法实现的。当一个线程调用对象的wait()方法时,该线程会被放入到对象的等待集中,并释放对象的锁。其他线程可以获取对象的锁并执行相关操作。

在调用wait()方法时,必须先获取对象的锁。否则,会抛出IllegalMonitorStateException异常。通常,在调用wait()方法之前,需要先通过synchronized块或方法来获取对象的锁。

二、唤醒操作

唤醒操作是通过调用对象的notify()方法或notifyAll()方法实现的。当一个线程调用对象的notify()方法时,会从对象的等待集中选择一个线程唤醒,让其获取对象的锁并执行相关操作。如果调用notifyAll()方法,则会将对象等待集中的所有线程都唤醒。

同样地,在调用notify()或notifyAll()方法之前,也需要先获取对象的锁。否则,会抛出IllegalMonitorStateException异常。

三、示例代码

演示:

public class WaitWakeExample {
    private Object lock = new Object();
    private int count = 0;

    public void incrementCount() {
        synchronized (lock) {
            while (count == 5) {
                try {
                    // 等待唤醒
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            count++;
            System.out.println("Count: " + count);
            // 唤醒其他线程
            lock.notifyAll();
        }
    }

    public void decrementCount() {
        synchronized (lock) {
            while (count > 0) {
                try {
                    // 等待唤醒
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            count--;
            System.out.println("Count: " + count);
            // 唤醒其他线程
            lock.notifyAll();
        }
    }
}

incrementCount()和decrementCount()这两个方法都会先检查count的值,如果count不满足条件,就会调用wait()方法进入等待状态。当count满足条件时,就会调用notifyAll()方法唤醒所有等待的线程。这样就可以保证多个线程能够正确地共享count变量,避免数据不一致和线程冲突等问题。

上一篇:easyexcel导入导出百万条数据思路分析
下一篇:没有了
网友评论