`

等待/通知之交叉备份实例

阅读更多
题目:创建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线程交替备份的效果
分享到:
评论

相关推荐

    基于Quartus II的FPGA/CPLD数字系统设计实例

    基于Quartus II的FPGA/CPLD数字系统设计实例 中图法分类号: TP332.1/684 周润景, 图雅, 张丽敏编著 电子工业出版社 第1章 Altera Quartus II开发流程 1.1 Quartus II软件综述 1.2 设计输入 1.3 约束输入 1.4 ...

    oracle冷备份实例forwindows

    Oracle 冷备份实例 for Windows oracle 冷备份是指在 Windows 平台上对 Oracle 数据库实例进行备份的操作。冷备份需要将企业的 Oracle 数据库实例shutdown下来,并将所有的数据文件、控制文件、参数文件等拷贝回来...

    C#2005实例数据库附加/还原/备份/分离/删除等操作

    C#2005实例数据库附加/还原/备份/分离/删除等操作,方便数据库的管理,在不需要登录SQL管理器,就能操作。直观。同时可以换皮肤设置等。

    LabWindows/CVI逐步深入与开发实例光盘

    标签"LabWindows/CVI逐步深入与开发实例 光盘"进一步强调了学习路径的系统性和实践性,光盘中的内容可能被划分为不同阶段,每个阶段都包含相关实例,用户可以通过这些实例进行自我测试和技能提升。 在压缩包子文件...

    mysql 备份脚本实例

    mysql 备份脚本实例,本人亲测,可以正常使用,需要根据真实路径修改相关配置

    Python实现备份文件实例

    本文实例讲述了Python实现备份文件的方法,是一个非常实用的技巧。分享给大家供大家参考。具体方法如下: 该实例主要实现读取一个任务文件, 根据指定的任务参数自动备份. 任务文件的格式: (注意,分号后面注释是不...

    金蝶云(K3/cloud)webapi 开发实例

    金蝶云(K3/cloud)WebAPI开发实例是针对企业级财务管理软件金蝶云的API接口进行编程实践的示例项目。金蝶云,原名K3,是金蝶国际软件集团推出的一款云端ERP解决方案,它为企业提供了全面的财务、供应链、生产制造等...

    rman备份恢复实例

    根据提供的文件内容,本文将详细解释RMAN(Recovery Manager)在Oracle数据库中的备份与恢复操作,特别是关于归档模式的设置以及RMAN的各种命令应用。 ### 一、归档模式设置 #### 1. 设置数据库为归档模式 为了...

    Oracle备份和恢复实例

    Oracle 备份和恢复实例 Oracle 备份和恢复实例是 Oracle 数据库管理系统中非常重要的一部分,它们都是为了保证数据库的可靠性和完整性。数据库恢复可以分为两类:实例故障的一致性恢复和介质故障或文件错误的不...

    1个简单的三层B/S架构实例

    三层B/S架构是一种常见的软件设计模式,特别是在开发Web应用程序时广泛采用。...通过深入学习和实践这个三层B/S架构实例,初学者可以逐步掌握Web应用程序开发的核心技术,为后续的复杂项目打下坚实的基础。

    LIS通信相关HL7协议/ASTM协议介绍及实例

    LIS通信相关,HL7协议/ASTM协议介绍及实例,内含若干厂家的说明文档

    Linux环境下rman备份的实例脚本

    "Linux环境下RMAN备份实例脚本" 本文档介绍了在Linux环境下使用RMAN进行数据库备份的实例脚本。RMAN(Recovery Manager)是Oracle数据库中的一个备份和恢复工具,用于管理和维护数据库的备份和恢复。 背景 _target...

    oracle数据库备份与还原实例

    Oracle 数据库备份与还原实例 Oracle 数据库备份与还原是数据库管理的重要步骤,涉及到数据的安全性和可靠性。本文将介绍 Oracle 数据库备份与还原实例,使用 exp 与 imp 方式导出和导入数据,同时也包含 Linux ...

    rman备份操作实例

    介绍oracle热备基础知识,包含备份检查,增量备份,各数据库文件备份方法等。

    C/C++串口通信典型应用实例编程实践.(电子工业.曹卫杉)

    书名:《C/C++串口通信典型应用实例编程实践》(电子工业出版社.曹卫杉) PDF扫描版,全书共分10章,共316页。 内容介绍 本书从工程应用的角度出发,对目前流行的三种不同类型的C/C++语言(包括C++ Builder、Visual ...

    STM32实例程序 8.BKP_test_备份寄存器使用

    STM32实例程序 8.BKP_test_备份寄存器使用STM32实例程序 8.BKP_test_备份寄存器使用STM32实例程序 8.BKP_test_备份寄存器使用STM32实例程序 8.BKP_test_备份寄存器使用STM32实例程序 8.BKP_test_备份寄存器使用STM32...

    iscroll5上拉下拉实例完整demo

    **iscroll5上拉下拉实例完整demo**是基于iscroll5库的一个示例项目,主要针对移动Web环境,展示了如何实现平滑的滚动效果,包括上拉加载更多和下拉刷新的功能。iscroll5是Jacob Gohmann开发的一个轻量级的JavaScript...

    Oracle19c rac备份数据通过rman恢复到单实例

    在进行Oracle 19c RAC(Real Application Clusters)数据库的数据备份与恢复操作时,可能会遇到需要将RAC集群环境下的备份数据恢复到单实例环境中的场景。这种情况下,RMAN(Recovery Manager)作为Oracle提供的强大...

    asp.net 数据库备份源代码(实例)

    这个实例源代码提供了一种方法,帮助开发者实现数据库的自动或手动备份。以下是基于标题和描述所涉及的关键知识点的详细解释: 1. **ASP.NET**: ASP.NET是Microsoft开发的一个用于构建Web应用程序的框架,它提供了...

    Oracle 11g R2 Rman备份与恢复_刘耀龙的博客-CSDN博客_rman备份.pdf

    恢复是备份的反向过程,分为实例恢复和介质恢复。实例恢复是数据库实例失败后的自动恢复,而介质恢复是在存储介质故障时进行的,包括完全恢复和不完全恢复。完全恢复恢复到故障前状态,而不完全恢复则可以恢复到某一...

Global site tag (gtag.js) - Google Analytics