Java多线程编程3--线程间通信实例--等待/通知之交叉备份

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

Java多线程编程3--线程间通信实例--等待/通知之交叉备份_第1张图片

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线程交替备份的效果

你可能感兴趣的:(多线程,交叉打印,等待通知模式)