等待/通知之交叉备份实例
程序员文章站
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线程交替备份的效果