欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-12 20:35:20
...
题目:创建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线程交替备份的效果
相关标签: thread