Witam!
Mam taki problem: chciałbym napisać program wielowątkowy, składający się z czterech wątków, z których każdy drukuje jedną literę (A, B, C, D) po czym śpi przez losowy okres czasu z tym, że w żadnym momencie ilość liter A i B, nie może przekroczyć ilości liter C i D, ilość liter A nie może przekroczyć dwukrotności liter B, a jeśli wydrukowana została litera C, to kolejna może pojawić się po co najmniej jednej literze D. Do komunikacji chciałbym wykorzystać metody wait(), notify(), notifyAll(). Próbowałem zacząć od prostego programu:
[code]
public class Literki
{
public synchronized static void main (String args[])
{
Watek watek = new Watek();
watek.start();
}
}
class Watek extends Thread
{
private int licznikA;
private int licznikB;
private int licznikC;
private int licznikD;
private boolean czyC;
private Object rygiel;
WatekA watekA;
WatekB watekB;
public Watek()
{
licznikA = 0;
licznikB = 0;
licznikC = 0;
licznikD = 0;
czyC = false;
rygiel = new Object();
watekA = new WatekA();
watekB = new WatekB();
}
public void run()
{
try
{
synchronized(rygiel)
{
watekA.start();
watekB.start();
while(!this.isInterrupted())
{
while(watekA.licznik == watekB.licznik*2)
{
watekA.wait();
System.out.println("A czeka");
}
watekA.notify();
}
}
}
catch(InterruptedException e)
{
System.out.println("Watek: ktos przerwal mi prace!");
}
}
}
class WatekA extends Thread
{
public int licznik = 0;
public void run()
{
try
{
while(!this.isInterrupted())
{
System.out.println("A");
licznik++;
sleep((int)(Math.random()*1000));
}
}
catch(InterruptedException e)
{
System.out.println("Watek A: ktos przerwal mi prace!");
}
}
}
class WatekB extends Thread
{
public int licznik = 0;
public void run()
{
try
{
while(!this.isInterrupted())
{
System.out.println("B");
licznik++;
sleep((int)(Math.random()*1000));
}
}
catch(InterruptedException e)
{
System.out.println("Watek B: ktos przerwal mi prace!");
}
}
}
[/code]
Wyświetla mi się jednak błąd java.lang.IllegalMonitorStateException . Jak sobie z tym poradzić i czy w ogóle to jak podchodzę do problemu jest właściwe (schemat klas itp.)? Byłbym bardzo wdzięczny za wszelką pomoc, ponieważ próbuję rozgryźć ten program już bardzo długo i nie mogę sobie poradzić! :(