要求: 创建20个线程(??一共20个线程main不应该是10吗?),十个线程将数据备份到数据库A,十个线程将数据备份到数据库B,且备份A与备份B是交叉进行的。同时还要求有序。
// 数据库操作
public class DBTools {
volatile private boolean prevIsA = false;
synchronized public 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();
}
}
synchronized public void backupB() {
try {
while (prevIsA == false) { //用while代替if防止出现条件改变的情况
wait();
}
for (int i = 0; i < 5; i++) {
System.out.println("*****");
}
prevIsA = false;
notifyAll(); //用notifyAll()替换notify()防止出现“假死”
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 线程类
public class BackupA extends Thread{
private DBTools db;
public BackupA(DBTools db) {
this.db = db;
}
@Override
public void run() {
db.backupA();
}
}
public class BackupB extends Thread {
private DBTools db;
public BackupB(DBTools db) {
this.db = db;
}
@Override
public void run() {
db.backupB();
}
}
// 主函数
public class Main {
public static void main(String[] args) throws Exception{
DBTools dbTools = new DBTools();
for (int i = 0; i < 20; i++) { // ???一共20个线程这里不应该是10吗?
BackupB output = new BackupB(dbTools);
output.start();
BackupA input = new BackupA(dbTools);
input.start();
}
}
}
结果: