Java 三个线程依次输出ABC
源于:https://lax.v2ex.com/t/547045#reply43
编写一个程序,开启 3 个线程 A,B,C,这三个线程的输出分别为 A、B、C,每个线程将自己的 输出在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC....
1 package com.ljw.HelloJava;
2
3 import java.util.concurrent.TimeUnit;
4 import java.util.function.Predicate;
5
6 public class ABCThreads {
7 private static Integer index = 0;
8 private static Integer max = 6;
9 private static Object lock = new Object();
10
11 public static void main(String[] args) {
12
13 Thread a = getThread(i -> i % 3 == 0, "A");
14 Thread b = getThread(i -> i % 3 == 1, "B");
15 Thread c = getThread(i -> i % 3 == 2, "C");
16 a.start();
17 b.start();
18 c.start();
19
20 }
21
22 private static Thread getThread(Predicate<Integer> condition, String value) {
23 return new Thread(() -> {
24 while (true) {
25 synchronized (lock) {
26 while (!condition.test(index)) {
27 try {
28 //如果已经不需要继续,直接return,避免继续等待
29 if (index >= max) {
30 return;
31 }
32 lock.wait();
33 } catch (InterruptedException e) {
34 System.out.println(e.getMessage());
35 }
36 }
37 //如果已经不需要继续,通知所有wait的线程收拾东西回家后,然后自己回家
38 if (index >= max) {
39 lock.notifyAll();
40 return;
41 }
42
43 System.out.printf("index:%s,value:%s\n", index, value);
44 index++;
45 lock.notifyAll();
46 }
47 }
48 });
49 }
50 }
Java 三个线程依次输出ABC的更多相关文章
- 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束
简要分析: 要求三个线程轮流输出,这里我们要使用一个对象锁,让关键部分的代码放入同步块当中.同时要有一个变量记录打印的次数到达10次循环后不再打印,另外一个就是要给每个线程一个标志号,我们根据标识号来 ...
- 用三个线程循环输出ABC
前两天看Java吧有人求助这个问题.想了想并不是很难.今天就顺手实现了一下. 我自己想到的有两种方法,一个是使用synchronized,一个是使用lock. 一.synchronized packa ...
- Java使用volatile实现多线程输出ABC共10次
问题 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C.要求,同时启动三个线程, 按顺序输出ABC, 循环10次. 今天在写多线程的时候找例子,见到了这样一个题,觉得不难,但是在网 ...
- Java多线程:用三个线程控制循环输出10次ABC
转载:http://www.cnblogs.com/gaopeng527/p/5257884.html 题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个 ...
- java多线程编程题之连续打印abc的几种解法
一道编程题如下: 实例化三个线程,一个线程打印a,一个打印b,一个打印c,三个线程同时执行,要求打印出6个连着的abc 题目分析: 通过题意我们可以得出,本题需要我们使用三个线程,三个线程分别会打印6 ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- java Semaphore实现ABC三个线程循环打印
Semaphore位于java.util.concurrent包下.其中有两个重要的方法acquire()和release().acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号 ...
- java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息
本文直接附上源代码,如下是自己写的一个例子 面试题需求: 使用Condition来实现 三个线程 线程1 线程2 线程3 三个交替输出 [按照 线程1(main)-->线程2-->线程3] ...
随机推荐
- 06_LaTeX之特色工具和功能
06_\(\LaTeX{}\) 之特色工具和功能 目录 06_\(\LaTeX{}\) 之特色工具和功能 参考文献和 \(\texttt{BibTeX}\) 工具 基本的参考文献和引用 \(\text ...
- CF2111E Changing the String
CF2111E Changing the String 题意 给定一个仅由 \(a,b,c\) 组成的字符串 \(S\). 给出 \(q\) 次操作.每个操作 \((x,y)\) 表示将 \(S\) ...
- .NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
在使用MudTools.OfficeInterop.Word库进行Word文档自动化处理时,深入理解Word对象模型的核心组件是至关重要的.Word对象模型提供了一套层次化的结构,使开发者能够通过编程 ...
- 【光照】[漫反射diffuse]以UnityURP为例
[从UnityURP开始探索游戏渲染]专栏-直达 漫反射基本流程 漫反射遵循兰伯特定律(Lambert's Cosine Law),其核心流程如下: 法线准备:获取表面法线向量(通常来自顶点法线或 ...
- 联发科OPPO联手冲高端:开放心态是行业的正向力量
不久前,智能手机市场迎来一个重磅产品:首发天玑9000旗舰芯片的OPPO Find X5 Pro天玑版.这是联发科去年底正式发布天玑9000芯片后的首个终端产品,也是OPPO冲击高端旗舰市场的又一重要 ...
- 模拟集成电路设计系列博客——7.5.6 时间交错型ADC
7.5.6 时间交错型ADC 我们可以通过将多个ADC做并行来实现非常高速的ADC[Black, 1980].下图展示了一个四通道时间交错型ADC的架构图: 此处,\(\phi_0\)是一个四倍于\( ...
- SystemC简介与安装
SystemC简介与安装 介绍 最近在搭建一个仿真器的工作,希望可以实现电路系统建模以后直接模拟macro上进行完整网络推理的电路表现,这样无论是设计过程时探索设计空间,进行方案评估,以及流片后的性能 ...
- WSL 下使用 SSH 访问 GitHub 受阻的配置经验
在某些网络环境下,直接通过 SSH 访问 GitHub 会受阻,比如 22 端口被屏蔽.这篇文章总结了我在 Windows + WSL 环境下,利用 Clash Verge 的 TUN 模式 配置 S ...
- 智能加速计算卡设计原理图:688-基于 VM1302的双路100G光纤PCIe4.0X16加速计算卡
一.产品概述 基于Xilinx芯片方案基础上研发的一款双口100 G FPGA光纤以太网PCI-Express v4.0 x16智能加速计算卡,该智能卡拥有高吞吐量.低延时的网络处理能力以及辅助CPU ...
- conda环境下如何仅卸载指定包
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...