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