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

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();
    }
}

原文地址:https://www.cnblogs.com/helloworldmybokeyuan/p/11718137.html

时间: 2024-08-30 02:04:57

经典多线程问题-轮流打印字母和数字的相关文章

线程笔记一:java线程经典题目:轮流打印

题目:构建四个线程,线程A将变量100加1,B减1,c加1,D减1,要按照A->B->C->D的顺序执行,最终数字还为100.使用多线程 代码: PrintLetter.java import java.lang.Thread; class MyThread implements Runnable{ //给线程分配三个对象 private Object pre; private Object self; private Num num; public MyThread(Object pr

Java n个线程轮流打印数字的问题

一. 实现两个线程.轮流打印出数字.例如以下: bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread --> 6 aThread --> 5 bThread --> 4 aThread --> 3 bThread --> 2 aThread --> 1 用java中的Lock类实现: package com.yjq.thread_demo; import java.uti

Java-两个线程轮流打印数字的问题

实现两个线程,轮流打印出数字,如下: bThread --> 10 aThread --> 9 bThread --> 8 aThread --> 7 bThread --> 6 aThread --> 5 bThread --> 4 aThread --> 3 bThread --> 2 aThread --> 1 用java中的Lock类实现: package com.yjq.thread_demo; import java.util.con

打印回文数字&amp;字母

1.指定位数的数字型回文,第一种方法是通过判断每一位数来确定是否是回文, 这种方法不够灵活,如果位数变了,代码就要修改,如下: """打印100到999之间的回文数ABA""" #从100开始循环,循环内判断是否符合要求,符合即输出num1 = 100i = 1while num1 <= 999: #获得百位数值 b = num1 // 100 #获得个位数值 g = num1 % 10 #判断百位和个位是否相同 if b == g: pr

ios 一个正则表达式测试(只可输入中文、字母和数字)

分类: iOS(390) 作者同类文章X 目录(?)[+] 一NSString自带的正则查找替换方法 二使用 RegexKitLite 三使用 RegexKitframework 框架 四常用ICU正则匹配模式 文本文件 Text Files 网络与URL相关 Network and URL 五贪婪匹配与最小匹配 六正则表达式书写格式 javascript正则表达式使用详解 在项目中碰到了正则表达式的运用,正则还是非常强大的,不管什么编程语言,基本上都可以用到.之前在用java时特别是对用户名或

js各类正则表达式(中文、字母、数字、全角)

转载自:http://www.cnblogs.com/xujh/archive/2008/08/21/1273525.html 非常全,很详细的js总结 1.只能输入数字.字母.中文的: <input   onkeypress="return   /[\w\u4e00-\u9fa5]/.test(String.fromCharCode(window.event.keyCode))"         onpaste="return   !/[^\w\u4e00-\u9fa

打印螺旋矩阵数字

明确了方阵数字是螺旋递增以后,发现每一个"口"字型的一圈数字正好闭合且连续递增.所以解题思路是由"口"字型的 递增依次向内嵌套.先填充最外层"口"字型的一圈数字,接着填充次外层--最后填充最内层的四个数.由一些较简单的画图可以 看出,层数的奇偶会影响到最内层的填充.当为奇数时,最内层只剩一个数字需要填充.所以奇数层需要单独考虑. 先是填充顶部的(n-1)个数字,接着由顶部的最后一个数字开始向下,填充右部的(n-1)个数字,接着是底部的(n-1)个

Java正则表达式过滤出字母、数字和中文

原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [html] view plain copy [^(A-Za-z)] (2) 过滤出 数字 的正则表达式 [html] view plain copy [^(0-9)] (3) 过滤出 中文 的正则表达式 [html] view plain copy [^(\\u4e00-\\u9fa5)] (4) 过滤出

WORD2010如何把全角字母和数字批量转换成半角

个人觉得全角字符看起来相当别扭,如果文档中存在大量全角形式的字母和数字,要如何把它们全部转化成半角的呢? 全角和半角 全角是指一个字符占用两个标准字符位置的状态.汉字字符和规定了全角的英文字符及国标GB2312-80中的图形符号和特殊字符都是全角字符. 半角的显示内码都是一个字节,英文字母.罗马数字.西方语言的符号都是半角形式. END 如何实现全角半角间的转换 全角字符占用更多字符,看起来也不够美观,如何将全角字符转换成半角的呢?这里我们可以利用word来实现.   不论是txt文档还是其他什