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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章