/*
需求:
使用lock接口實現商品的生產和銷售的動態平衡
思路:
1、創建被共同操作的數據類Resource,並通過多態引用分別創建lock和condition子類對象以及資源的獲取和賦值方法
2、創建兩個相反操作即生產和銷售的類同時實現Runnable接口,並覆蓋run方法
3、在主函數中,創建資源對象,並作為共同參數分別傳遞給生產和銷售兩個線程實現類的構造函數
4、分別將生產和銷售類的對象作為參數,傳給兩個線程,並各自開啟線程
/
package com.horse146;
import java.util.concurrent.locks.;
class ProducerConsumerDemo
{
public static void main(String[] args) //主函數
{
Resource r=new Resource();
Producer p=new Producer(r);
Consumer c=new Consumer(r);
Thread t1=new Thread(p);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}
class Resource //被共同操作的數據類
{
String name;
int id;
boolean flag;
Lock lock=new ReentrantLock();//創建鎖對象
Condition pro=lock.newCondition();
//用上面創建的鎖對象,調用其newCondition方法,創建Condition子類對象,實現對lock鎖的等待喚醒操作
Condition con=lock.newCondition();
public void set(String name)throws InterruptedException{//創建賦值方法,並針對等待異常拋出
lock.lock();
try{
while(flag)
pro.await();//lock鎖下面的Pro線程等待
this.name=name+"----"+id;
System.out.println(Thread.currentThread().getName()+"生產出"+this.name);
flag=true;
con.signal();//lock鎖下面的con線程喚醒
}
finally{
lock.unlock();//解鎖
}
}
public void get()throws InterruptedException{//創建取值方法,對針對等待異常拋出
lock.lock();
try{
while(!flag)
con.await();
System.out.println(Thread.currentThread().getName()+"消費了"+this.name);
flag=false;
pro.signal();//Pro線程喚醒
}
finally{
lock.unlock();
}
}
}
class Producer implements Runnable//生產者類實現Runnable接口
{
private Resource r;
Producer(Resource r){
this.r=r;
}
public void run(){
while(true){
try{r.set("商品");}
catch(InterruptedException e){}
}
}
}
class Consumer implements Runnable//消費者類實現Runnable接口
{
private Resource r;
Consumer(Resource r){
this.r=r;
}
public void run(){
while(true){
try{r.get();}
catch(InterruptedException e){}
}
}
}
我不知道你那裡怎麼回事 雖說邏輯可能有些問題 不過在我這著沒有報錯