`
daojin
  • 浏览: 677312 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
wait notify多线程学习 wait notify多线程学习 考察wait notify 交互的一道面试题目


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();

    }
}



Global site tag (gtag.js) - Google Analytics