等待/通知之交叉备份实例

题目:创建20个线程,其中10个线程是将数据备份到A数据库中,另外10个线程将数据备份到B数据库中,并且备份A数据库和B数据库是交叉进行的。 
  首先创建出20个线程,效果如图3-41所示。 
  通过一些手段将这20个线程的运行效果变成有序的,如图3-42所示。 


public class DBTools {
    //确保备份数据库A首先执行
    private volatile boolean prevIsA = false;

    public synchronized void backupA() {
        try {
            while (prevIsA == true) {
                wait();
            }
            for (int i=0; i<5; i++) {
                System.out.println("+++++");
            }
            prevIsA = true;
            notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void backupB() {
        try {
            while (prevIsA == false) {
                wait();
            }
            for (int i=0; i<5; i++) {
                System.out.println("^^^^^");
            }
            prevIsA = false;
            notifyAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


public class BackupA extends Thread {
    private DBTools dbTools;

    public BackupA(DBTools dbTools) {
        this.dbTools = dbTools;
    }
    public void run() {
        dbTools.backupA();
    }
}
public class BackupB extends Thread {
    private DBTools dbTools;

    public BackupB(DBTools dbTools) {
        this.dbTools = dbTools;
    }
    public void run() {
        dbTools.backupB();
    }
}

public class Run {
    public static void main(String[] args) throws InterruptedException {
       DBTools dbTools = new DBTools();
        for (int i=0; i<20; i++) {
            BackupB output = new BackupB(dbTools);
            output.start();
            BackupA input = new BackupA(dbTools);
            input.start();
        }
    }
}

+++++ 
+++++ 
+++++ 
+++++ 
+++++ 
^^^^^ 
^^^^^ 
^^^^^ 
^^^^^ 
^^^^^ 
+++++ 
+++++ 
+++++ 
+++++ 
+++++ 
^^^^^ 
^^^^^ 
^^^^^ 
^^^^^ 
^^^^^ 
…… 
打印的效果是交替运行的。 
  交替打印的原理就是使用如下代码作为标记: 
  private boolean volatile prevIsA = false; 
  实现了A和B线程交替备份的效果

猜你喜欢

转载自flyvszhb.iteye.com/blog/2410585