package MyTesting;
/**
* 输出A字符任务
* @author xinchun.wang
*
*/
class TaskA implements Runnable {
private Object lockC;
private Object lockA;
public TaskA(Object lockC,Object lockA) {
this.lockC = lockC;
this.lockA = lockA;
}
@Override
public void run() {
while (true) {
synchronized (lockC) {
try {
while (!PrintData.mCHavPrint) {
lockC.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
PrintData.mCHavPrint = false;
}
System.out.println("A");
synchronized(lockA){
PrintData.mAHavPrint = true;
lockA.notify();
}
}
}
}
/**
* 输出B字符串任务
* @author xinchun.wang
*
*/
class TaskB implements Runnable {
private Object lockA;
private Object lockB;
public TaskB(Object lockA,Object lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
while (true) {
synchronized (lockA) {
try {
while (!PrintData.mAHavPrint) {
lockA.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
PrintData.mAHavPrint = false;
}
System.out.println("B");
synchronized (lockB) {
PrintData.mBHavPrint= true;
lockB.notify();
}
}
}
}
/**
* 输出C字符串任务
* @author xinchun.wang
*
*/
class TaskC implements Runnable {
private Object lockB;
private Object lockC;
public TaskC(Object lockB,Object lockC) {
this.lockB = lockB;
this.lockC = lockC;
}
@Override
public void run() {
while (true) {
synchronized (lockB) {
try {
while (!PrintData.mBHavPrint) {
lockB.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
PrintData.mBHavPrint = false;
}
System.out.println("C");
synchronized (lockC) {
PrintData.mCHavPrint = true;
lockC.notify();
}
}
}
}
/**
* 测试例子
* @author xinchun.wang
*
*/
public class PrintData {
public static boolean mCHavPrint = true;
public static boolean mAHavPrint = false;
public static boolean mBHavPrint = false;
public static void main(String[] args) {
Object lockA = new Object();
Object lockB = new Object();
Object lockC = new Object();
Thread tA = new Thread(new TaskA(lockC,lockA));
Thread tB = new Thread(new TaskB(lockA,lockB));
Thread tC = new Thread(new TaskC(lockB,lockC));
tA.start();
tB.start();
tC.start();
}
}
|