zoukankan      html  css  js  c++  java
  • java多线程打印ABC

    /**
     * 方案一
     * 
     * @author LY
     */
    public class LockObject {
    
        public String lockName;
    
        public LockObject() {
        }
    
        public LockObject(String lockName) {
            this.lockName = lockName;
        }
    
        public String getLockName() {
            return lockName;
        }
    
        public void setLockName(String lockName) {
            this.lockName = lockName;
        }
    
    }
    
    public class MyThread implements Runnable {
    
        private String name;
        private String next;
        private LockObject lock;
    
        MyThread(String name, String next, LockObject lock) {
            this.name = name;
            this.next = next;
            this.lock = lock;
        }
    
        /**
         * 三个线程同时启动:
         * 1.new Thread(new MyThread("A", "B", data)).start();
         * 2.new Thread(new MyThread("B", "C", data)).start();
         * 3.new Thread(new MyThread("C", "A", data)).start();
         * 同时进入循环:
         * 前面Data data = new Data("A");
         * 所以data=A
         * 第一个线程满足条件,进入同步方法:打印A,设置data=B,count=2
         * 第二个线程不满足条件,进入无限循环,count=3
         * 第三个线程不满足条件,进入无限循环,count=3
         * data=B
         * 第二个线程满足条件,进入同步方法:打印B,设置data=C,count=2
         * 第一个线程不满足条件,进入无限循环,count=2
         * 第三个线程不满足条件,进入无限循环,count=3
         * data=C
         * 第三个线程满足条件,进入同步方法:打印C,设置data=A,count=2
         * 第一个线程不满足条件,进入无限循环,count=2
         * 第二个线程不满足条件,进入无限循环,count=2
         * 
         * 当再次data=A
         * 从第一个线程开始,三个线程依次符合条件再跑一次,count=1
         *
         * 打印结果:ABCABCABC
         */
        public void run() {
            int count = 3;
            while (count > 0) {
                if (lock.getLockName().equals(name)){
                    synchronized (lock) {
                        System.out.print(name);
                        lock.setLockName(next);
                        count--;
                    }
                }
            }
        }
        
        public static void main(String[] args) throws InterruptedException {
            LockObject data = new LockObject("A");
            new Thread(new MyThread("A", "B", data)).start();
            new Thread(new MyThread("B", "C", data)).start();
            new Thread(new MyThread("C", "A", data)).start();
        }
    
    }
    /**
     * 方案二
     * 
     * @author LY
     */
    public class MyThread implements Runnable {
    
        private String name;
        private MyThread myThread;
    
        public MyThread() {}
    
        public MyThread(String name) {
            this.name = name;
        }
    
        public void setMyThread(MyThread myThread) {
            this.myThread = myThread;
        }
    
        public void run() {
            int count = 0;
            try {
                while (count < 3) {
                    synchronized (myThread) {
                        synchronized (this) {
                            System.out.print(name);
                            count++;
                            this.notify();
                        }
                        myThread.wait();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            MyThread a = new MyThread("A");
            MyThread b = new MyThread("B");
            MyThread c = new MyThread("C");
    
            a.setMyThread(c);
            b.setMyThread(a);
            c.setMyThread(b);
    
            new Thread(a).start();
            Thread.sleep(10);
            new Thread(b).start();
            Thread.sleep(10);
            new Thread(c).start();
            Thread.sleep(10);
        }
    
    }
  • 相关阅读:
    9、Spring Boot 2.x 集成 Thymeleaf
    【专题】Spring Boot 2.x 面试题
    8、Spring Boot 2.x 服务器部署
    7、Spring Boot 2.x 集成 Redis
    6、Spring Boot 2.x 集成 MyBatis
    5、Spring Boot 2.x 启动原理解析
    4、Spring Boot 2.x 自动配置原理
    3、Spring Boot 2.x 核心技术
    2、Spring Boot 2.x 快速入门
    centOS下安装JDK1.8.60,glassfish4.1.1以及MySQL
  • 原文地址:https://www.cnblogs.com/linying/p/4519252.html
Copyright © 2011-2022 走看看