题目:创建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线程交替备份的效果
等待/通知之交叉备份实例
最新推荐文章于 2021-07-20 05:20:00 发布