美文网首页
线程交叉执行Demo

线程交叉执行Demo

作者: BestbpF | 来源:发表于2018-10-16 22:58 被阅读32次

    简述

    创建20个线程,模拟以下场景

    • 10个线程将数据备份到A数据库
    • 10个线程将数据备份到B数据库
    • 两种操作交替执行(A先执行)

    代码

    【DBTools】
    【用于提供数据备份服务】

    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) {
                    wait();
                }
                for (int i = 0; i < 5; i++) {
                    System.out.println("☆☆☆☆☆");
                }
                prevIsA = false;
                notifyAll();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    【BackupA】
    【备份A的线程】

    public class BackupA extends Thread {
    
        private DBTools dbtools;
    
        public BackupA(DBTools dbtools) {
            super();
            this.dbtools = dbtools;
        }
    
        @Override
        public void run() {
            dbtools.backupA();
        }
    
    }
    

    【BackupB】
    【备份B的线程】

    public class BackupB extends Thread {
    
        private DBTools dbtools;
    
        public BackupB(DBTools dbtools) {
            super();
            this.dbtools = dbtools;
        }
    
        @Override
        public void run() {
            dbtools.backupB();
        }
    
    }
    

    【测试】

    public class Run {
    
        public static void main(String[] args) {
            DBTools dbtools = new DBTools();
            for (int i = 0; i < 10; i++) {
                BackupB output = new BackupB(dbtools);
                output.start();
                BackupA input = new BackupA(dbtools);
                input.start();
            }
        }
    
    }
    

    【结果】

    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ★★★★★
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    ☆☆☆☆☆
    

    相关文章

      网友评论

          本文标题:线程交叉执行Demo

          本文链接:https://www.haomeiwen.com/subject/jwbkzftx.html