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();
}}
}
}