码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-10-22 11:18:37      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:nbsp   demo   str   oid   sys   current   question   als   catch   

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

 

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

标签:nbsp   demo   str   oid   sys   current   question   als   catch   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!