问题

给出两个线程,要求两个线程交替打印从1到100,例如:A线程打印1,B线程打印2,A线程打印3...依次类推,直到打印到100

思路

这里主要是考察对java中wait/notifyAll机制的理解,可以开启两个线程,循环对数字进行自增,同时设置一个标记位,标记A线程是否对数字进行自增和打印,循环监听该标记位的值,如果已经打印完成,则将A线程置为等待状态,同时调用notifyAll,通知其它线程唤醒,线程B的操作与线程A相反

代码实现

public class NumTest {

static Object object = new Object();

static int num = 0;

static volatile boolean aPrint = false;

static class A implements Runnable {

@Override

public void run() {

while (num < 99) {

synchronized (object) {

while (aPrint) {

try {

object.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

num++;

System.out.println(String.format("线程%s打印数字%d", Thread.currentThread().getName(), num));

aPrint = true;

object.notifyAll();

}

}

}

}

static class B implements Runnable {

@Override

public void run() {

while (num < 99) {

synchronized (object) {

while (!aPrint) {

try {

object.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

num++;

System.out.println(String.format("线程%s打印数字%d", Thread.currentThread().getName(), num));

aPrint = false;

object.notifyAll();

}

}

}

}

public static void main(String[] args) {

Thread threadA = new Thread(new A());

threadA.setName("threadA");

Thread threadB = new Thread(new B());

threadB.setName("threadB");

threadA.start();

threadB.start();

}

}

运行结果(部分):

image.png

这里解释一下为什么while里面的判断要用 num < 99,我们设想一下当num自增到98时,一定是有一个线程处理wait状态,此时另一个线程做自增时,num变成了99,随后执行notifyAll唤醒wait的线程,wait的线程苏醒后继续向下执行,再自增一次得到正确结果

java 线程交替输出,[java]java经典问题之线程交替打印数字相关推荐

  1. java用数组输出fibo_[Java教程]养兔子Fibo函数优化

    [Java教程]养兔子Fibo函数优化 0 2017-02-24 00:00:16 Title 本文网址:http://www.shaoqun.com/a/302303.html *特别声明:以上内容 ...

  2. Java二进制小数表示_《Java编程的逻辑》笔记9--小数的二进制表示

    小数计算为什么会出错? 简要答案 实际上,不是运算本身会出错,而是计算机根本就不能精确的表示很多数,比如0.1这个数. 计算机是用一种二进制格式存储小数的,这个二进制格式不能精确表示0.1,它只能表示 ...

  3. java array缓存_有java数组

    [JAVA零基础入门系列]Day10 Java中的数组 [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 D ...

  4. 用生产者和消费者模式实现奇数偶数不同线程交替输出

    要求 使用生产者和消费者模式实现,交替输出: 假设只有两个线程,输出以下结果:t1-->1t2-->2t1-->3t2-->4t1-->5t2-->6....要求: ...

  5. 【Java】java 实现 线程交替输出

    1.概述 如何实现线程的交替输出? 2.LockSupport方案 package com.java.lock.locksupport;import org.junit.Test;import jav ...

  6. Java面试经典题:线程池的成长之路

    本文转载自公众号: 猿天地 1.背景 相信大家在面试过程中遇到面试官问线程的很多,线程过后就是线程池了.从易到难,都是这么个过程,还有就是确实很多人在工作中接触线程池比较少,最多的也就是创建一个然后往 ...

  7. java 多线程输出_[Java多线程]ABC三个线程顺序输出的问题

    大概的问题是这样的: 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C 要求, 同时启动三个线程, 按顺序输出ABC, 循环10次 这是一个多线程协同的问题, 本身多线程是没有执行 ...

  8. Java 三个线程依次输出ABC

    源于:https://lax.v2ex.com/t/547045#reply43 编写一个程序,开启 3 个线程 A,B,C,这三个线程的输出分别为 A.B.C,每个线程将自己的 输出在屏幕上打印 1 ...

  9. 编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次。

    编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次. 一.ThreadDemo class ThreadDemo extends Thread {public ...

最新文章

  1. 怎样在ROS下实现基于YOLO的px4无人机目标检测?
  2. 暂停和播放CSS3动画的两种实现方法
  3. RSA key format is not supported
  4. Win8下怎样安装Win7 or Win7下怎样安装win8?
  5. A Data Access Layer to persist business objects using attributes and reflection - Part III [无常译]...
  6. 知乎通过港交所上市聆讯 2021年营收29.6亿元
  7. vim 删除当前词_VIM中常用的查找、替换、删除模式总结
  8. 浏览器是如何工作的系列:页面布局
  9. 【错误】函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
  10. 移植wireless extension
  11. 干货---ARCGIS拓扑规则说明详细讲解
  12. javascript实现的中国象棋单机双人
  13. Python 编辑器汇总
  14. 【EXLIBRIS】随笔记 012
  15. 函数9:生成器和 yield 语句
  16. python中for ch in是什么意思_python中for是什么
  17. 【计算机算法】贪心算法——看电影、活动选择问题
  18. 如何在同一窗口打开多个终端并实现快捷键切换
  19. android4.0 x86,PC专用Android 4.0 x86系统上手体验
  20. simple-uploader前端分片上传文件

热门文章

  1. 深入学习SAP UI5框架代码系列之八:谈谈 SAP UI5 的视图控件 ID,以及 SAP UI5 视图和 Angular 视图的异同
  2. SAP Spartacus directive学习笔记
  3. ngrx注入到应用类构造函数里的store变量
  4. SAP CRM WebClient UI的configuration按钮点击之后,发生了什么事情
  5. SAP Cloud for Customer和Hybris Commerce的session保护机制
  6. SAP Hybris里搜索显示结果的实现原理
  7. campaign read in WebUI - Fiori is correct!
  8. Fiori Elements value help的工作原理
  9. UI5_INFO_FETCH_FROM_DB
  10. SAP CRM中间件调试的一些重要方法