通模擬備份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數據庫