Java多线程实现生产者消费者设计模式

这个题目是多线程很常见的题目,主要就是知道wait()和notify()方法的作用

import java.util.Date;
import java.util.LinkedList;

/**
 * 用wait/notify实现生产者消费者
 * @author : vi3nty
 * @date : 21:08 2020/4/17
 */
public class ProducerConsumer {
    public static void main(String[] args) {
        TaskEvent taskEvent=new TaskEvent();
        TaskProducer producer=new TaskProducer(taskEvent);
        TaskConsumer consumer=new TaskConsumer(taskEvent);
        producer.start();
        consumer.start();
    }
}
//定义生产者线程
class TaskProducer extends Thread{
    private TaskEvent taskEvent;
    public TaskProducer(TaskEvent taskEvent){
        this.taskEvent=taskEvent;
    }

    @Override
    public void run() {
        //这里写循环到100只是让程序停止下来
        for(int i=0;i<100;i++){
            try {
                taskEvent.producer();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//定义消费者线程
class TaskConsumer extends Thread{
    private TaskEvent taskEvent;
    public TaskConsumer(TaskEvent taskEvent){
        this.taskEvent=taskEvent;
    }

    @Override
    public void run() {
        for(int i=0;i<100;i++){
            try {
                taskEvent.consumer();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
//定义任务
class TaskEvent{
    private static final int MAXSIZE=10;
    private LinkedList<Date> list;
    public TaskEvent() {
        this.list = new LinkedList<>();
    }
    synchronized void producer() throws InterruptedException {
        while (list.size()==MAXSIZE){
            wait();
        }
        list.add(new Date());
        System.out.println("当前生产了"+list.size()+"个");
        notify();
    }
    synchronized void consumer() throws InterruptedException {
        while (list.size()==0){
            wait();
        }
        list.poll();
        System.out.println("当前消费了1个,还剩"+list.size()+"个");
        notify();
    }
}

代码执行结果,比较好的按照预想的情况执行了。这里所涉及的知识点就是wait()方法是释放monitor锁的,这时候其他线程就可以重新拿到锁。

当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前生产了10个
当前消费了1个,还剩9个
当前生产了10个
当前消费了1个,还剩9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个
当前生产了1个
当前生产了2个
当前生产了3个
当前生产了4个
当前生产了5个
当前生产了6个
当前生产了7个
当前生产了8个
当前生产了9个
当前生产了10个
当前消费了1个,还剩9个
当前消费了1个,还剩8个
当前消费了1个,还剩7个
当前消费了1个,还剩6个
当前消费了1个,还剩5个
当前消费了1个,还剩4个
当前消费了1个,还剩3个
当前消费了1个,还剩2个
当前消费了1个,还剩1个
当前消费了1个,还剩0个

Process finished with exit code 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值