Java中的wait和notify方法

Java中的wait和notify方法

wait和notify方法不是线程对象的方法,是java中任何一个java对象都有的方法,因为这两个方式是Object类中自带的。 wait方法作用:正在对象上活动的线程进入等待状态,无期限等待,直到被唤醒为止 notify方法作用:唤醒处于等待状态的线程
package com.javase.threading;

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

/*使用wait方法和notify方法实现生产者和消费者模型*/
public class ProCusModel {
    public static void main(String[] args) {
        // 创建一个仓库对象
        List list = new ArrayList();
        // 创建2个线程对象
        Thread t1 = new Thread(new Produce(list));
        Thread t2 = new Thread(new Consume(list));

        t1.setName("生产者线程");
        t2.setName("消费者线程");

        t1.start();
        t2.start();
    }
}

// 生产线程
class Produce implements Runnable {
    // 仓库
    private List list;

    public Produce(List list) {
        this.list = list;
    }

    @Override
    public void run() {
        // 一直生产
        while (true) {
            synchronized (list) {
                if (list.size() > 0) {
                    // 当前线程进入等待状态, 并且释放list集合的锁
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                Object obj = new Object();
                list.add(obj);
                System.out.println(Thread.currentThread().getName() + "---->" + obj);
                // 唤醒消费者消费
                list.notify();

            }
        }
    }
}

// 消费线程
class Consume implements Runnable {
    // 仓库
    private List list;

    public Consume(List list) {
        this.list = list;
    }

    @Override
    public void run() {
        // 一直消费
        while (true) {
            synchronized (list) {
                if (list.size() == 0) {
                    // 仓库已经空了,消费者等待,释放掉list集合的锁
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // 仓库中有数据
                Object obj = list.remove(0);
                System.out.println(Thread.currentThread().getName() + "--->" + obj);
                // 唤醒生产哲生成
                list.notify();
            }
        }
    }
}
分享到 :

发表评论

登录... 后才能评论