• 经典多线程问题(四)-轮流打印字母和数字


    1.0 synchronized

    package com.example.demo.study.questions;
    
    /**
     * @ClassName Question13
     * @Description: 经典多线程问题-轮流打印字母和数字
     * @Author xtanb
     * @Date 2019/10/22
     * @Version V1.0
     **/
    public class Question13 {
        private volatile boolean flag = true;
        private int count = 1;
    
        public synchronized void printNum(){
            while (!flag){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.print(2*count-1);
            System.out.print(2*count);
            flag = false;
            this.notify();
        }
    
        public synchronized void printABC(){
            while (flag){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.print((char)('A'+count-1));
            count++;
            flag = true;
            this.notify();
        }
    
    
        public static void main(String[] args) {
            Question13 question13 = new Question13();
            new Thread(()->{
                for(int i=0;i<26;i++){
                    question13.printNum();
                }
            }).start();
            new Thread(()->{
                for(int i=0;i<26;i++){
                    question13.printABC();
                }
            }).start();
        }
    }

    2.0 ReentranLock

    package com.example.demo.study.questions;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * @ClassName Question14
     * @Description: 经典多线程问题-轮流打印字母和数字
     * @Author xtanb
     * @Date 2019/10/22
     * @Version V1.0
     **/
    public class Question14 {
    
        private volatile boolean flag = true;
        private Lock lock = new ReentrantLock();
        private Condition condition = lock.newCondition();
        private int num = 1;
    
        public void printNum(){
            try {
                lock.lock();
                while (!flag){
                    try{
                        condition.await();
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                System.out.print(num*2-1);
                System.out.print(num*2);
    
                flag = false;
                condition.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    
        public void printABC(){
            try {
                lock.lock();
                while (flag){
                    try{
                        condition.await();
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                System.out.print((char)('A'+num-1));
                num++;
                flag = true;
                condition.signal();
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }
    
        public static void main(String[] args) {
            Question14 question14 = new Question14();
            new Thread(()->{
               for(int i=0;i<26;i++){
                   question14.printNum();
               }
            }).start();
            new Thread(()->{
                for(int i=0;i<26;i++){
                    question14.printABC();
                }
            }).start();
        }
    }
  • 相关阅读:
    C++小项目:directx11图形程序(七):modelclass
    C++小项目:directx11图形程序(六):cameraclass
    C++小项目:directx11图形程序(五):shadersclass
    C++小项目:directx11图形程序(四):d3dclass
    C++小项目:directx11图形程序(三):graphicsclass
    C++小项目:directx11图形程序(二):systemclass
    舞台上加载一外部SWF,舞台如何调用该swf内部方法呢?
    as3绘制抛物线
    Unity常用代码总结
    C# ref和out区别介绍
  • 原文地址:https://www.cnblogs.com/helloworldmybokeyuan/p/11718137.html
Copyright © 2020-2023  润新知