java 生产者消费者 demo_生产者与消费者--demo1---bai
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
//自定義類,描述倉庫
public class StoreHouse
{
private List products = new ArrayList(); //倉庫的所有商品的列表
public void add(String product)
{
this.products.add(product);
}
Random rd = new Random();
public String sale() //隨機從所有商品中,任取一件進行出售
{
int index = rd.nextInt(this.products.size());
//從數組中,刪除序號為index的商品。并作為返回值返回。
String product = this.products.remove(index);
return product;
}
//獲取倉庫的商品個數
public int getSize()
{
return this.products.size();
}
}
import java.util.Random;
//消費者線程。不斷的消費
public class ConsumeThread extends Thread
{
private StoreHouse house;//持有1個倉庫
//構造函數中,傳入倉庫對象
public ConsumeThread(StoreHouse house)
{
this.house = house;
}
@Override
public void run() {
Random rd = new Random();
while(true)
{
synchronized (house)
{
if(house.getSize()==0)
{
System.out.println("倉庫為空,消費者開始等待...");
//如果倉庫為空,則本消費者線程進入等待狀態。會釋放同步鎖。
try {
house.wait(); //釋放同步鎖,其他線程可以繼續執行。
//Thread.sleep(3000);//不釋放同步鎖。所以其他線程無法繼續執行。
//house.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized (house)
{
if (house.getSize() > 0) //只要倉庫的庫存大于0
{
String product = house.sale();
System.out.println("消費者從倉庫中取走了 " + product);
}
}
try {
Thread.sleep(rd.nextInt(2000));
} catch (InterruptedException e) {
e.printStackTrace();
} //隨機休息2秒以內的時間
}
}
}
import java.util.Random;
//生產者線程。不斷的往倉庫添加商品
public class ProduceThread extends Thread
{
private StoreHouse house;//持有1個倉庫
//構造函數中,傳入倉庫對象
public ProduceThread(StoreHouse house)
{
this.house = house;
}
@Override
public void run()
{
Random rd = new Random();
//不斷的往倉庫添加商品
while(true)
{
synchronized (house)
{
//隨機產生1個商品名
String product = "商品" + rd.nextInt(200);
//將該商品添加到倉庫
house.add(product);
house.notifyAll();//通知所有其他處于wait狀態的線程繼續執行
System.out.println("生產者將 " + product + " 添加到倉庫中");
}
try {
Thread.sleep(rd.nextInt(2000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //隨機休息2秒以內的時間
}
}
}
public class Test
{
public static void main(String[] args)
{
//1 創建1個倉庫對象,作為共享數據
StoreHouse house = new StoreHouse();
//2 創建生產者線程
ProduceThread pt = new ProduceThread(house);
//3 創建消費者線程
ConsumeThread ct1 = new ConsumeThread(house);
ConsumeThread ct2 = new ConsumeThread(house);
//4 啟動線程
pt.start();
ct1.start();
ct2.start();
}
}
總結
以上是生活随笔為你收集整理的java 生产者消费者 demo_生产者与消费者--demo1---bai的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 无限级分类限定层级_王者荣耀:s20战令
- 下一篇: 动态游标for循环_【【动图算法】(动态