c语言父子线程交替打印,java 面试题 -- 多线程按序交替打印

本文通过一个Java程序展示了如何使用锁和条件变量实现三个线程按顺序打印ID。程序创建了A、B、C三个线程,它们会按顺序打印自己的ID共10遍,输出结果始终按ABC的顺序排列。代码中使用了ReentrantLock和Condition进行同步控制。
摘要由CSDN通过智能技术生成

西北野狼

我的github: https://github.com/soyoungboy

我的segmentfault: http://segmentfault.com/u/soyoungboy

【不积跬步,无以至千里;不积小流,无以成江海】

博客园   首页   新随笔   联系   订阅 b0d135bd686564c301afa4b920d8cc91.gif 

管理 随笔-477  评论-20  文章-0

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

package com.company;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/*

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

* 如:ABCABCABC…… 依次递归

*/

public class TestABCAlternate {

public static void main(String[] args) {

AlternateDemo ad = new AlternateDemo();

new Thread(() -> {

for (int i = 1; i <= 10; i++) {

ad.loopA(i);

}

}, "A").start();

new Thread(() -> {

for (int i = 1; i <= 10; i++) {

ad.loopB(i);

}

}, "B").start();

new Thread(() -> {

for (int i = 1; i <= 10; i++) {

ad.loopC(i);

}

}, "C").start();

}

}

class AlternateDemo {

private int number = 1; //当前正在执行线程的标记

private Lock lock = new ReentrantLock();

private Condition condition1 = lock.newCondition();

private Condition condition2 = lock.newCondition();

private Condition condition3 = lock.newCondition();

/**

* @param totalLoop : 循环第几轮

*/

void loopA(int totalLoop) {

lock.lock();

try {

//1. 判断

if (number != 1) {

condition1.await();

}

//2. 打印

for (int i = 1; i <= 1; i++) {

System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);

}

//3. 唤醒

number = 2;

condition2.signal();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

void loopB(int totalLoop) {

lock.lock();

try {

//1. 判断

if (number != 2) {

condition2.await();

}

//2. 打印

for (int i = 1; i <= 1; i++) {

System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);

}

//3. 唤醒

number = 3;

condition3.signal();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

void loopC(int totalLoop) {

lock.lock();

try {

//1. 判断

if (number != 3) {

condition3.await();

}

//2. 打印

for (int i = 1; i <= 1; i++) {

System.out.println(Thread.currentThread().getName() + "\t" + i + "\t" + totalLoop);

}

System.out.println("------------------");

//3. 唤醒

number = 1;

condition1.signal();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

}复制代码

上面有一部分使用java1.8新特性写的,看下结果:

A 1 1

B 1 1

C 1 1

------------------

A 1 2

B 1 2

C 1 2

------------------

A 1 3

B 1 3

C 1 3

------------------

A 1 4

B 1 4

C 1 4

------------------

A 1 5

B 1 5

C 1 5

------------------

A 1 6

B 1 6

C 1 6

------------------

A 1 7

B 1 7

C 1 7

------------------

A 1 8

B 1 8

C 1 8

------------------

A 1 9

B 1 9

C 1 9

------------------

A 1 10

B 1 10

C 1 10

------------------复制代码

posted on 2017-04-02 12:26 西北野狼 阅读(22) 评论(0) 编辑 收藏 刷新评论刷新页面返回顶部 注册用户登录后才能发表评论,请 登录 或 注册,

访问网站首页。 【推荐】超50万VC++源码: 大型工控、组态\仿真、建模CAD源码2018!

【推荐】微信小程序一站式部署 多场景模板定制

aa36b6f710852f3affec6bfeccade0dd.png 最新IT新闻:

· 你逛的这些地方,可能都是腾讯的地盘

· 你已经习惯了的这些衣食住行,其实都是阿里的地盘

· 华为云总裁郑叶来:公有云竞争远未结束 AI被过度消费

· 扎克伯格纪念FB诞生14周年:你们想到的错误 我都犯过

· A站凉了,百万“猴子”无家可归

» 更多新闻... 839164a648ec9a719261d299c96545de.png 最新知识库文章:

· 领域驱动设计在互联网业务开发中的实践

· 步入云计算

· 以操作系统的角度述说线程与进程

· 软件测试转型之路

· 门内门外看招聘

» 更多知识库文章... 历史上的今天:

2016-04-02 android app 集成 信鸽推送

昵称:西北野狼

园龄:

4年6个月

粉丝:34

关注: 3 +加关注

2018年2月

28

29

30

31

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

1

2

3

4

5

6

7

8

9

10

搜索

常用链接

我的标签

随笔分类

随笔档案

My github

我的个人博客站点

积分与排名

积分 - 110533

排名 - 2676

最新评论

阅读排行榜

评论排行榜

推荐排行榜

博客园 模板提供:沪江博客 Copyright ©2018 西北野狼

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值