自学内容网 自学内容网

线程间通信:wait和notify

线程间通信:wait和notify

1、Object的wait和notify方法

Java中的Object类提供了两个重要的方法,用于线程间的通信和同步:wait()方法和notify()方法

wait()方法的定义

  • 方法签名public final void wait() throws InterruptedException
  • 功能:使当前线程等待,直到其他线程调用此对象的notify()notifyAll()方法。换句话说,当一个线程调用某个对象的wait()方法时,它会进入这个对象的等待池中,并释放该对象的对象锁(监视器)。
  • 使用条件:必须在同步块(synchronized block)或同步方法中调用,因为当前线程必须拥有该对象的监视器。如果试图在非同步环境中调用wait(),会抛出IllegalMonitorStateException异常。

notify()方法的定义

  • 方法签名public final void notify()
  • 功能:唤醒在此对象监视器上等待的单个线程。如果有多个线程都在此对象上等待,则选择一个线程进行唤醒,选择是任意性的。注意,调用notify()方法并不会立即使等待线程从wait()返回,而是需要等到当前线程释放了该对象的监视器之后,被选中的等待线程才有机会获得该监视器并继续执行。
  • 使用条件:也必须在同步块或同步方法中调用,因为当前线程必须拥有该对象的监视器。如果试图在非同步环境中调用notify(),也会抛出IllegalMonitorStateException异常。

2、消费者和生产者代码

商店类

import java.util.ArrayList;
import java.util.List;

public class Store {

    public Store(){}

    private List<String> apples = new ArrayList<>();
    private Object o = new Object();

    public void custom(){
        synchronized(o){
            if (apples.size() == 0) {
                try {
                    o.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            String apple = apples.get(apples.size()-1);
            System.out.println("消费者消费了:"+apple);
            apples.remove(0);
            o.notify();
        }
    }

    public void product(String apple){
        synchronized(o){
            if (apples.size() > 0) {
                try {
                    o.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            apples.add(apple);
            System.out.println("生产者生产了:"+apple);
            o.notify();
        }
    }

}

消费者类

public class Customer implements Runnable{

    private Store store;

    public Customer(Store store){
        this.store = store;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            store.custom();                
        }
    }
    
}

生产者类

public class Producter implements Runnable{

    private Store store;

    public Producter(Store store){
        this.store = store;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            store.product("苹果"+i);
        }
    }
    
}

执行类

import java.util.ArrayList;
import java.util.List;

public class CustomerProducter {

    /**
     * 1. 生产者:没有产品,就要开始生产,生产完毕通知消费者,有产品等待消费者消费
     * 2. 消费者:有产品,开始消费,消费完毕通知生产者,没有产品等待生产者生产
     * 3. 缓冲区
     * 
     */
    public static void main(String[] args) {
        Store store = new Store();
        Customer customer = new Customer(store);
        Producter producter = new Producter(store);
        new Thread(customer).start();
        new Thread(producter).start();
    }

    
}

执行结果

生产者生产了:苹果0
消费者消费了:苹果0
生产者生产了:苹果1
消费者消费了:苹果1
...
生产者生产了:苹果98
消费者消费了:苹果98
生产者生产了:苹果99
消费者消费了:苹果99

原文地址:https://blog.csdn.net/qq_42948831/article/details/143898246

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!