線程間通信之等待通知

通模擬備份A數據、備份B數據 來實現線程交替運行。方法加synchronized 實現同步

  • 創建工具類設置變量控制線程交替出現
     package com.dairuijie.thread.test01;
    /**
     - 
     - @ClassName:  DBUtils   
     - @Description:TODO(實現備份交替運行)   
     - @author: drj 
     - @date:   2019年7月21日 下午10:17:51   
     -     
     - @Copyright: 2019 
     -  */
    public class DBUtils {
    
    	volatile private boolean flag = true;
    
    	public synchronized void backUpA() {
    		try {
    			while (flag == true) {
    				wait();
    			}
    		    System.out.println("備份A數據庫");
    			flag = true;
    			notifyAll();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    
    	public synchronized void backUpB() {
    		try {
    			while (flag == false) {
    				wait();
    			}
    			System.out.println("備份B數據庫");
    			flag = false;
    			notifyAll();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    `
  • 創建備份A數據庫線程
package com.dairuijie.thread.test01;
/**
 * 
 * @ClassName:  BackUpA   
 * @Description:TODO(備份A 數據)   
 * @author: drj 
 * @date:   2019年7月21日 下午10:22:57   
 *     
 * @Copyright: 2019 
 *
 */
public class BackUpA extends Thread {

	private DBUtils utils;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		utils.backUpA();
	}
	public BackUpA(DBUtils utils) {
		super();
		this.utils = utils;
	}

}

  • 備份B 數據庫線程
package com.dairuijie.thread.test01;
/**
 * 
 * @ClassName:  BackUpB   
 * @Description:TODO(備份B 線程)   
 * @author: drj 
 * @date:   2019年7月21日 下午10:20:53   
 *     
 * @Copyright: 2019 
 *
 */
public class BackUpB extends Thread {

	private DBUtils utils;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		utils.backUpB();
	}
	public BackUpB(DBUtils utils) {
		super();
		this.utils = utils;
	}

}

  • 測試
package com.dairuijie.thread.test01;

public class Demo {
	public static void main(String[] args) {
		DBUtils db = new DBUtils();
		for (int i = 0; i < 10; i++) {
			BackUpA a = new BackUpA(db);
			a.start();
			BackUpB b = new BackUpB(db);
			b.start();
		}
	}
}

  • 效果
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
    備份B數據庫
    備份A數據庫
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章