生產(chǎn)者消費(fèi)者模式
方式一:創(chuàng)建容器的方法
/*
*
* 生產(chǎn)者消費(fèi)者模式
*/
public class ProducerAndCustomerTest {
public static void main(String[] args) {
//先創(chuàng)建容器
LinkedList<Egg> list = new LinkedList<>();
Producer s1 = new Producer(list);
Customer s2 = new Customer(list);
//創(chuàng)建線程
Thread t1 = new Thread(s1,"母雞");
Thread t2 = new Thread(s2,"消費(fèi)者");
//啟動(dòng)線程
t1.start();
t2.start();
}
}
//產(chǎn)品類
class Egg{
private int id;
public Egg(int id) {
super();
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Egg [id=" + id + "]";
}
}
//生產(chǎn)者線程
class Producer implements Runnable{
//設(shè)置一個(gè)集合作為屬性一會(huì)存儲(chǔ)元素
private LinkedList<Egg> list;
private int id =1;
//構(gòu)造方法獲得list
public Producer(LinkedList<Egg> list) {
super();
this.list = list;
}
@Override
public void run() {
//生產(chǎn)過程
while(true){
synchronized(list){
while(list.size() == 8){
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//如果沒滿到這一步開始生產(chǎn)
Egg egg = new Egg(id++);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//存入容器
list.push(egg);
System.out.println(Thread.currentThread().getName() + "母雞下蛋" + egg.getId());
list.notify();
}
}
}
}
//消費(fèi)者線程
class Customer implements Runnable{
private LinkedList<Egg> list;
public Customer(LinkedList<Egg> list) {
super();
this.list = list;
}
@Override
public void run() {
while(true){
synchronized(list){
while(list.size() == 0){
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Egg egg = list.pop();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "消費(fèi)者消費(fèi)" + egg.getId());
list.notify();
}
}
}
}