经典多线程问题-轮流打印字母和数字
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(); } }
以上是关于经典多线程问题-轮流打印字母和数字的主要内容,如果未能解决你的问题,请参考以下文章