源于: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的更多相关文章

  1. 使用Java 多线程编程 让三个线程轮流输出ABC,循环10次后结束

    简要分析: 要求三个线程轮流输出,这里我们要使用一个对象锁,让关键部分的代码放入同步块当中.同时要有一个变量记录打印的次数到达10次循环后不再打印,另外一个就是要给每个线程一个标志号,我们根据标识号来 ...

  2. 用三个线程循环输出ABC

    前两天看Java吧有人求助这个问题.想了想并不是很难.今天就顺手实现了一下. 我自己想到的有两种方法,一个是使用synchronized,一个是使用lock. 一.synchronized packa ...

  3. Java使用volatile实现多线程输出ABC共10次

    问题 有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C.要求,同时启动三个线程, 按顺序输出ABC, 循环10次. 今天在写多线程的时候找例子,见到了这样一个题,觉得不难,但是在网 ...

  4. Java多线程:用三个线程控制循环输出10次ABC

    转载:http://www.cnblogs.com/gaopeng527/p/5257884.html 题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个 ...

  5. java多线程编程题之连续打印abc的几种解法

    一道编程题如下: 实例化三个线程,一个线程打印a,一个打印b,一个打印c,三个线程同时执行,要求打印出6个连着的abc 题目分析: 通过题意我们可以得出,本题需要我们使用三个线程,三个线程分别会打印6 ...

  6. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  7. 编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

  8. java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现

    注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...

  9. java Semaphore实现ABC三个线程循环打印

    Semaphore位于java.util.concurrent包下.其中有两个重要的方法acquire()和release().acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号 ...

  10. java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息

    本文直接附上源代码,如下是自己写的一个例子 面试题需求: 使用Condition来实现 三个线程 线程1 线程2 线程3 三个交替输出 [按照 线程1(main)-->线程2-->线程3] ...

随机推荐

  1. 使用二次封装的Excel COM 组件操作Excel\WPS ET IExcelRange 高级应用

    想要更优雅地处理数据复制.格式化.筛选和排序等高级操作?这篇指南将带你深入了解 IExcelRange 的强大功能,让你的 Excel 操作技能更上一层楼! 本指南适用于需要进行复杂 Excel 操作 ...

  2. hive 中 group by 和 distinct 孰优孰劣?

    hive 中 group by 和 distinct 孰优孰劣? 首先声明一下,hive是什么: hive 不是数据库,hive 只是一个数据仓库工具,可以用来查询.转化和加载数据,是可以调用 map ...

  3. 优先级队列PriorityQueue(图文并茂)

    介绍 优先级队列的作用是能保证每次取出的元素都是队列中权值最小(或最大)的.这里元素大小的评判可以通过元素本身的自然顺序(natural ordering),也可以通过构造时传入的比较器(Compar ...

  4. vue-cli3.0 引入外部字体并使用

    遇到要在项目中引入一些外部字体,我使用的是思源字体 cli2的我还没试过,现在的方法是cli3的, 不用配置config文件就可以 第一步: 去下载想要引入的字体的字体包,找ui要或者网上自己去搜 第 ...

  5. EF Core 与 MySQL:迁移和关系配置详解

    本文将详细讲解EF Core与MySQL的关系配置和迁移,包括一对一.一对多.多对多关系的配置,使用Fluent API进行关系配置,处理迁移中的常见问题,以及数据种子的方法. 1. EF Core ...

  6. 高速图像处理卡设计原理图:527-基于3U VPX XCZU15EG+TMS320C6678的信号处理板

    一.板卡概述 本板卡系我司自主研发的基于3U VPX风冷.导冷架构的信号处理板,适用于高速图像处理等.芯片采用工业级设计. 板卡采用标准3U VPX架构,板上集成一片Xilinx公司ZynqUltra ...

  7. XCZU15EG信号处理板学习资料第527篇:基于3U VPX XCZU15EG+TMS320C6678的信号处理板

    基于3U VPX XCZU15EG+TMS320C6678的信号处理板 一.板卡概述 本板卡系我司自主研发的基于3U VPX风冷.导冷架构的信号处理板,适用于高速图像处理,雷达信号处理等.芯片采用工业 ...

  8. P11820 [PA 2015] 健身房 / Siłownia

    P11820 [PA 2015] 健身房 / Siłownia 也许是另一种贪心做法,但是似乎需要卡空间,所以输麻了. 题意 有 \(m\) 个器材,有 \(n\) 个人要健身. 第 \(i\) 个人 ...

  9. time包

    time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息. go 的time.now就是你当前所处时区的时间 package mai ...

  10. 应用安全 --- apk加固 之 vmp

    vmp一句话来讲就是自定义字节码的虚拟机类似JVM,使得解析dex的工具失效从而大幅增加逆向分析的门槛. 详细来讲就是 ,将java字节码转义并将转义的解析器写入C++,解析器会解析java指令和数据 ...