Re: Threads - synchronization
In article <1164033163.575037.184310@h54g2000cwb.googlegroups.com>,
<jimmie0@wp.pl> wrote:
Gordon Beaton napisal(a):
[ snip ]
A correct solution should not require sleep() at all.
[ snip ]
i think that now is ok. can you take a look?
Well, I'm not Gordon, and I'm guessing that you're considering
this problem solved and moving on to something else (in the
thread with subject line "Threads interruption"), but .... :
Is there a reason why you're using wait() and notifyAll() in ThC()
and ThD() but not in ThA() and ThB()? and are the calls to sleep()
meant to make thing synchronize right, or just to slow things down
so you can observe a desired interaction?
(I had some trouble understanding your original problem description,
and maybe it explains the difference between the logic in ThA()/ThB()
versus ThC()/ThD(). Apologies if that's the case.)
public class Th extends Thread
{
private int which;
private static int[] howMany = {0, 0, 0, 0} ;
private static Object obj;
public Th(int which)
{
this.which= which;
}
public void run()
{
switch (which)
{
case 1: ThA(); break;
case 2: ThB(); break;
case 3: ThC(); break;
case 4: ThD(); break;
}
}
public void ThA()
{
while(true)
{
synchronized(obj)
{
if ( (howMany[0]+howMany[1]) < (howMany[2]+howMany[3]) &&
(howMany[0] <= 2*howMany[1]))
{
System.out.print("A");
howMany[0]++;
}
try {
sleep(100);
}catch(InterruptedException e) {}
}}
}
public void ThB()
{
while(true)
{
synchronized(obj)
{
if ( (howMany[0]+howMany[1]) < (howMany[2]+howMany[3]) )
{
System.out.print("B");
howMany[1]++;
}
try {
sleep(200);
}catch(InterruptedException e) {}
}}
}
public void ThC()
{
while(true)
{
synchronized(obj)
{
System.out.print("C");
howMany[2]++;
try {
obj.wait();
sleep(300);
}catch(InterruptedException e) {}
}
}}
public void ThD()
{
while(true)
{
synchronized(obj)
{
System.out.print("D");
howMany[3]++;
try {
obj.notifyAll();
sleep(1000);
}catch(InterruptedException e) {}
}}
}
public static void main(String[] args)
{
obj = new Object();
new Th(1).start();
new Th(2).start();
new Th(3).start();
new Th(4).start();
}
}
--
B. L. Massingill
ObDisclaimer: I don't speak for my employers; they return the favor.