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

来源:互联网 发布:大学生兼职平台知乎 编辑:程序博客网 时间:2024/05/17 09:25

题目:创建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线程交替备份的效果

0 0
原创粉丝点击