多線程實(shí)戰(zhàn) 生產(chǎn)者消費(fèi)者模型

2022.8.31
今天學(xué)了Java多線程 并作了該實(shí)戰(zhàn)

視頻鏈接https://www.bilibili.com/video/BV1Gv411T7pi?p=96&vd_source=74dbfbbeb7bc0d33681acbc0237176f1

題目
通過(guò)多線程編程,來(lái)模擬一個(gè)餐廳的2個(gè)廚師和3個(gè)顧客,假設(shè)廚師炒出一個(gè)菜的時(shí)間為3秒,顧客吃掉菜品的時(shí)間為4秒。

首先確定有幾個(gè)線程和容器

線程有五個(gè) 容器用LIST模擬

private static List<Object> list=new ArrayList<>();
 Thread c1=new Thread(()->{
            add();

        });
        c1.setName("廚師1");

        Thread c2=new Thread(()->{
            add();
        });
        c2.setName("廚師2");
        c1.start();
        c2.start();
        Thread s1=new Thread(()->{
            take();

        });
        s1.setName("顧客1");

        Thread s2=new Thread(()->{
            take();
        });
        s2.setName("顧客2");

        Thread s3=new Thread(()->{
            take();
        });
        s3.setName("顧客3");
        s1.start();
        s2.start();
        s3.start();

接下來(lái)來(lái)分別編寫(xiě)add做菜和take取菜函數(shù)

add函數(shù)
注意做菜的條件是LIST空,所以需要等待LIST的喚醒(notify)
而且做菜的時(shí)間是3s,也就是線程休眠3s,做好菜也就是向LIST里添加一個(gè)Object

 private static void add()
    {
        while(true)
        {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (list){
                list.add(new Object());
                System.out.println(new Date()+Thread.currentThread().getName()+"添加了新的菜");
                list.notify();}
        }

    }

take吃菜函數(shù)

LIST不空時(shí)可以吃菜,所以LIST空時(shí)需要等待(wait)
且吃菜時(shí)間為4s 即睡眠4s
吃菜時(shí)從LIST中移除 LIST.remove(0)

private static void take()
    {
        while(true){
        try
        {
            synchronized (list)
            {
                while(list.isEmpty()) list.wait();
                System.out.println(new Date() +Thread.currentThread().getName()+"拿走了然然");
                list.remove(0);
            }
            Thread.sleep(4000);
        }catch (InterruptedException e)
        {
            e.printStackTrace();
        }}
    }

結(jié)果如下


QQ截圖20220831212450.png

全代碼

package 多線程;

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

public class 生產(chǎn)者消費(fèi)者模型 {
    private static List<Object> list=new ArrayList<>();

    public static void main(String[] args) {


        Thread c1=new Thread(()->{
            add();

        });
        c1.setName("廚師1");

        Thread c2=new Thread(()->{
            add();
        });
        c2.setName("廚師2");
        c1.start();
        c2.start();
        Thread s1=new Thread(()->{
            take();

        });
        s1.setName("顧客1");

        Thread s2=new Thread(()->{
            take();
        });
        s2.setName("顧客2");

        Thread s3=new Thread(()->{
            take();
        });
        s3.setName("顧客3");
        s1.start();
        s2.start();
        s3.start();
    }
    private static void add()
    {
        while(true)
        {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (list){
                list.add(new Object());
                System.out.println(new Date()+Thread.currentThread().getName()+"添加了新的然然");
                list.notify();}
        }

    }
    private static void take()
    {
        while(true){
        try
        {
            synchronized (list)
            {
                while(list.isEmpty()) list.wait();
                System.out.println(new Date() +Thread.currentThread().getName()+"拿走了然然");
                list.remove(0);
            }
            Thread.sleep(4000);
        }catch (InterruptedException e)
        {
            e.printStackTrace();
        }}
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容