zoukankan      html  css  js  c++  java
  • java实现线程交替打印1-52和A-Z

    题目:

     1.开启两个线程,一个线程打印A~Z,两一个线程打印1~52的数据。

     2.实现交替打印,输出结果为12A34B...........5152Z.

     3.请用多线程方式实现。

    实现思路:通过锁(synchronized) 与wait(),notifyAll()的 或者lock、await()、signal()来实现,废话不多说,直接上代码:

    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * @author admin
     * @create 2019-12-27-15:08
     */
    public class Print {
        public boolean letterFlag = true;//线程结束标记;
        public boolean numFlag = true;
        //数字的初始值
        int num = 1;
        //这里A~Z的字母对应的阿拉伯数字为65~90,
        int letter = 65;
        //线程等待标记
        boolean flag = true;
        Lock lock = new ReentrantLock();
        Condition condLetter = lock.newCondition();
        Condition condNum = lock.newCondition();
    
        public void printLetter() {
            if(letter>90){
                letterFlag =false;
                return;
            }
            lock.lock();
            try {
    
                if (flag){
                    condLetter.await();
                }
                System.out.print((char)letter);
                letter++;
                flag=true;
                condNum.signal();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    
    
        public void printNum() {
            if(num>=52){
                numFlag =false;
                return;
            }
            lock.lock();
            try {
    
                if (!flag){
                    condNum.await();
                }
                System.out.print(num);
                num++;
                System.out.print(num);
                num++;
                flag=false;
                condLetter.signal();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
        public static void main(String[] args) {
            Print print =new Print();
            new Thread(new Runnable() {
                @Override
                public void run() {
                 while (print.numFlag){
                     print.printNum();
                 }
                }
            }).start();
    
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                 while (print.letterFlag){
                     print.printLetter();
                 }
                }
            }).start();
        }
    
    }

    运行结果为:

    12A34B56C78D910E1112F1314G1516H1718I1920J2122K2324L2526M2728N2930O3132P3334Q3536R3738S3940T4142U4344V4546W4748X4950Y5152Z
  • 相关阅读:
    Spring中的destroy-method方法
    github Pull Request合入全流程介绍
    vue-router动态路由设置参数可选
    github上fork原项目,如何将本地仓库代码更新到最新版本?
    github的pull Request使用
    vue2.X版本vue-cli生成项目后运行失败,报错信息为getaddrinfo ENOTFOUND localhost
    npm在linux即mac下更新时报错
    数组Array和字符串String的indexOf方法,以及ES7(ES2016)中新增的Array.prototype.includes方法
    less的使用总结
    ssh连接github连不上
  • 原文地址:https://www.cnblogs.com/xiaofeng-fu/p/12109458.html
Copyright © 2011-2022 走看看