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

Posted helloworldmybokeyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典多线程问题-轮流打印字母和数字相关的知识,希望对你有一定的参考价值。

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++11多线程编程-两个进程轮流打印1~100

操作系统利用信号量多个线程轮流打印数字

java多线程连续打印字母数字问题

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

多线程打印:三个线程轮流打印0到100

多线程打印:三个线程轮流打印0到100