java 线程交替输出,[java]java经典问题之线程交替打印数字
问题
给出两个线程,要求两个线程交替打印从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经典问题之线程交替打印数字相关推荐
- java用数组输出fibo_[Java教程]养兔子Fibo函数优化
[Java教程]养兔子Fibo函数优化 0 2017-02-24 00:00:16 Title 本文网址:http://www.shaoqun.com/a/302303.html *特别声明:以上内容 ...
- Java二进制小数表示_《Java编程的逻辑》笔记9--小数的二进制表示
小数计算为什么会出错? 简要答案 实际上,不是运算本身会出错,而是计算机根本就不能精确的表示很多数,比如0.1这个数. 计算机是用一种二进制格式存储小数的,这个二进制格式不能精确表示0.1,它只能表示 ...
- java array缓存_有java数组
[JAVA零基础入门系列]Day10 Java中的数组 [JAVA零基础入门系列](已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 D ...
- 用生产者和消费者模式实现奇数偶数不同线程交替输出
要求 使用生产者和消费者模式实现,交替输出: 假设只有两个线程,输出以下结果:t1-->1t2-->2t1-->3t2-->4t1-->5t2-->6....要求: ...
- 【Java】java 实现 线程交替输出
1.概述 如何实现线程的交替输出? 2.LockSupport方案 package com.java.lock.locksupport;import org.junit.Test;import jav ...
- Java面试经典题:线程池的成长之路
本文转载自公众号: 猿天地 1.背景 相信大家在面试过程中遇到面试官问线程的很多,线程过后就是线程池了.从易到难,都是这么个过程,还有就是确实很多人在工作中接触线程池比较少,最多的也就是创建一个然后往 ...
- java 多线程输出_[Java多线程]ABC三个线程顺序输出的问题
大概的问题是这样的: 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C 要求, 同时启动三个线程, 按顺序输出ABC, 循环10次 这是一个多线程协同的问题, 本身多线程是没有执行 ...
- Java 三个线程依次输出ABC
源于:https://lax.v2ex.com/t/547045#reply43 编写一个程序,开启 3 个线程 A,B,C,这三个线程的输出分别为 A.B.C,每个线程将自己的 输出在屏幕上打印 1 ...
- 编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次。
编写一个Java程序实现多线程,在线程中输出线程的名字,隔300毫秒输出一次,共输出20次. 一.ThreadDemo class ThreadDemo extends Thread {public ...
最新文章
- 怎样在ROS下实现基于YOLO的px4无人机目标检测?
- 暂停和播放CSS3动画的两种实现方法
- RSA key format is not supported
- Win8下怎样安装Win7 or Win7下怎样安装win8?
- A Data Access Layer to persist business objects using attributes and reflection - Part III [无常译]...
- 知乎通过港交所上市聆讯 2021年营收29.6亿元
- vim 删除当前词_VIM中常用的查找、替换、删除模式总结
- 浏览器是如何工作的系列:页面布局
- 【错误】函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。
- 移植wireless extension
- 干货---ARCGIS拓扑规则说明详细讲解
- javascript实现的中国象棋单机双人
- Python 编辑器汇总
- 【EXLIBRIS】随笔记 012
- 函数9:生成器和 yield 语句
- python中for ch in是什么意思_python中for是什么
- 【计算机算法】贪心算法——看电影、活动选择问题
- 如何在同一窗口打开多个终端并实现快捷键切换
- android4.0 x86,PC专用Android 4.0 x86系统上手体验
- simple-uploader前端分片上传文件
热门文章
- 深入学习SAP UI5框架代码系列之八:谈谈 SAP UI5 的视图控件 ID,以及 SAP UI5 视图和 Angular 视图的异同
- SAP Spartacus directive学习笔记
- ngrx注入到应用类构造函数里的store变量
- SAP CRM WebClient UI的configuration按钮点击之后,发生了什么事情
- SAP Cloud for Customer和Hybris Commerce的session保护机制
- SAP Hybris里搜索显示结果的实现原理
- campaign read in WebUI - Fiori is correct!
- Fiori Elements value help的工作原理
- UI5_INFO_FETCH_FROM_DB
- SAP CRM中间件调试的一些重要方法