package sort;
public class ThreeThread {
volatile Object lock = new Object();
volatile Integer count = new Integer(0);
class Thread1 extends Thread {
@Override
public void run() {
while (true) {
synchronized (lock) {
while (count % 3 == 0) {
System.out.println("A");
count++;
lock.notifyAll();
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class Thread2 extends Thread {
@Override
public void run() {
while (true) {
// TODO Auto-generated method stub
synchronized (lock) {
while (count % 3 == 1) {
System.out.println("B");
count++;
lock.notifyAll();
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class Thread3 extends Thread {
@Override
public void run() {
while (true) {
// TODO Auto-generated method stub
synchronized (lock) {
while (count % 3 == 2) {
System.out.println("C");
count++;
lock.notifyAll();
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.notify();
try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
ThreeThread tt = new ThreeThread();
Thread t1 = tt.new Thread1();
t1.start();
Thread t2 = tt.new Thread2();
t2.start();
Thread t3 = tt.new Thread3();
t3.start();
}
}