ReentrantLock,配合Condition
public class PrintABC {
private int signal;
Lock lock = new ReentrantLock();
Condition a = lock.newCondition();
Condition b = lock.newCondition();
Condition c = lock.newCondition();
public void printA() {
lock.lock();
while (signal != 0) {
try {
a.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A");
signal++;
b.signal();
lock.unlock();
}
public void printB() {
lock.lock();
while (signal != 1) {
try {
b.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B");
signal++;
c.signal();
lock.unlock();
}
public void printC() {
lock.lock();
while (signal != 2) {
try {
c.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("C");
signal = 0;
a.signal();
lock.unlock();
}
public static void main(String[] args) {
PrintABC printABC = new PrintABC();
A a = new A(printABC);
B b = new B(printABC);
C c = new C(printABC);
new Thread(a).start();
new Thread(b).start();
new Thread(c).start();
}
}
class A implements Runnable {
private PrintABC printABC;
public A(PrintABC printABC) {
this.printABC = printABC;
}
@Override
public void run() {
while (true) {
printABC.printA();
}
}
}
class B implements Runnable {
private PrintABC printABC;
public B(PrintABC printABC) {
this.printABC = printABC;
}
@Override
public void run() {
while (true) {
printABC.printB();
}
}
}
class C implements Runnable {
private PrintABC printABC;
public C(PrintABC printABC) {
this.printABC = printABC;
}
@Override
public void run() {
while (true) {
printABC.printC();
}
}
}
synchronized
public class PrintABC {
private int signal = 0;
public synchronized void printA() {
while (signal != 0) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A");
signal++;
notifyAll();
}
public synchronized void printB() {
while (signal != 1) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B");
signal++;
notifyAll();
}
public synchronized void printC() {
while (signal != 2) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(600);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("C");
signal = 0;
notifyAll();
}
public static void main(String[] args) {
PrintABC printABC = new PrintABC();
A a = new A(printABC);
B b = new B(printABC);
C c = new C(printABC);
new Thread(a).start();
new Thread(b).start();
new Thread(c).start();
}
}
class A implements Runnable {
private PrintABC printABC;
public A(PrintABC printABC) {
this.printABC = printABC;
}
@Override
public void run() {
while (true) {
printABC.printA();
}
}
}
class B implements Runnable {
private PrintABC printABC;
public B(PrintABC printABC) {
this.printABC = printABC;
}
@Override
public void run() {
while (true) {
printABC.printB();
}
}
}
class C implements Runnable {
private PrintABC printABC;
public C(PrintABC printABC) {
this.printABC = printABC;
}
@Override
public void run() {
while (true) {
printABC.printC();
}
}
}