
Signature
[ don't email me support questions or followups ]
g o r d o n + n e w s @ b a l d e r 1 3 . s e
Gordon Beaton napisal(a):
> > i use this because if i try to synchronize on class System.out
> > [synchronize(System.out) compilator display some errors (for example in
[quoted text clipped - 44 lines]
> [ don't email me support questions or followups ]
> g o r d o n + n e w s @ b a l d e r 1 3 . s e
i think that now is ok. can you take a look?
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();
}
}
blmblm@myrealbox.com - 22 Nov 2006 09:54 GMT
> 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
> {
[quoted text clipped - 98 lines]
> }
> }

Signature
B. L. Massingill
ObDisclaimer: I don't speak for my employers; they return the favor.
Lew - 26 Nov 2006 23:47 GMT
Gordon Beaton napisal(a):
>> A correct solution should not require sleep() at all.
> i think that now is ok. can you take a look?
>
> public class Th extends Thread
> {
...
> sleep(100);
...
> sleep(200);
...
> sleep(300);
...
> sleep(1000);
...
> }
(P.S., avoid embedding TAB characters in newsgroup posts.)