J'ai écrit du code pour implémenter le problème producteur-consommateur et il semble fonctionner correctement sans avoir besoin de synchroniser.Est-ce possible?producteur-consommateur utilisant la synchronisation
Comment tester le code et vérifier s'il fonctionne correctement ou non? Comment savoir si un blocage se produira? Pour l'instant, je ne suis pas en train de sortir des boucles (c'est-à-dire que le producteur continue à insérer et le consommateur continue à consommer dans une boucle infinie) .J'utilise une file circulaire de taille 3 (par souci de simplicité) comme ressource partagée.
Voici mon code:
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;
}
}
Il sera probablement gâcher si vous supprimez le 'Sleeps'. – SwDevMan81
Bienvenue à la nature des bugs de synchronisation. Cela semble fonctionner correctement jusqu'au moment où il explose complètement. –
Pourquoi ne pas séparer la logique du producteur et du consommateur en deux implémentations séparées de «Runnable»? Cette conception est très inéligante et conduira à un code complètement non-identifiable. –