我編寫代碼來實現生產者 - 消費者問題,它似乎工作正常,無需同步。是否有可能?生產者 - 消費者使用同步
我該如何測試代碼並檢查它是否實際正常工作?我怎麼知道是否會發生死鎖?現在,我沒有擺脫循環(即生產者繼續插入並且消費者繼續消耗在無限循環中)。爲了簡單起見,我使用了大小爲3的循環隊列(爲了簡單起見)作爲共享資源。
這裏是我的代碼:
import java.util.*;
public class PCImpl implements Runnable
{
Thread t;
QforPC qObj;
public static void main(String[] args)
{
QforPC qObject=new QforPC();
//These create 2 different objects! Each object has it's own thread of execution.
//Synchronization is needed when 2 threads use the same object
new PCImpl("Producer",qObject);
new PCImpl("Consumer",qObject);
}
PCImpl(String name,QforPC qObj)
{
this.qObj=qObj;
t=new Thread(this,name);
t.start();
}
public void run()
{
if(Thread.currentThread().getName().equals("Producer"))
{
while(true)
{
Random rgen=new Random();
int n=rgen.nextInt(100);
if(n!=0)
qObj.Producer(n);
try
{
Thread.sleep(200);
}
catch(InterruptedException e)
{
}
}
}
if(Thread.currentThread().getName().equals("Consumer"))
{
while(true)
{
try
{
Thread.sleep(1500);
}
catch(InterruptedException e)
{
}
qObj.Consumer();
}
}
}
}
public class QforPC
{
int[] q={0,0,0};
int r=0,f=0;
public void Producer(int item)
{
if(r!=q.length && canProducer())
{
q[r]=item;
System.out.println("The item inserted into the queue is:"+ item);
r++;
}
if(r==q.length && f>0)
r=0;
else if(r==q.length && f==q.length)
{
r=0;
f=0;
}
}
public void Consumer()
{
int item;
System.out.println("The value of isQueue empty is:"+ isEmpty());
if(f!=q.length && isEmpty()==false)
{
System.out.println("Entered the consumer method");
item=q[f];
System.out.println("The item fetched from the queue is:"+item);
q[f]=0;
f++;
}
if(f==q.length && r<f)
f=0;
}
public boolean isEmpty()
{
for(int k=0;k<q.length;k++)
{
if(q[k]==0 && k==q.length-1)
return true;
}
return false;
}
public boolean canProducer()
{
for(int k=0;k<q.length;k++)
{
if(q[k]==0)
return true;
}
return false;
}
}
它可能會陷入困境,如果你刪除'Sleeps'。 – SwDevMan81 2010-12-14 18:59:55
歡迎來到時間錯誤的本質。它似乎正在正常工作,直到它完全爆炸。 – 2010-12-14 19:00:35
爲什麼不把生產者和消費者的邏輯分成兩個獨立的'Runnable'實現?這種設計非常不靈活,並且會導致完全無惡意的代碼。 – 2010-12-14 19:01:38