经典多线程问题-轮流打印字母和数字
发布时间:2020-12-15 07:19:26 所属栏目:Java 来源:网络整理
导读: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 boo
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(); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- JSP application.getRealPath()方法:获取虚拟路径的真实路
- java – 从ZipInputStream获取特定文件
- java – Spring Security permitAll()不允许匿名访问
- java.lang.IllegalArgumentException:由于无效的密钥而无法
- java – 始终保持在TreeSet中排序的可变对象
- Java8 HashMap扩容算法实例解析
- java – 两个类具有相同的XML类型名称“objectFactory”
- java – 图像未被缓存在本地(使用通用图像加载程序) – 缓慢
- java – 在方法调用期间分配和递增值
- Java 注解