`
MouseLearnJava
  • 浏览: 465978 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

面试题 -- 一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。

阅读更多

题目:一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。

解决的方法有很多种,比如:
使用synchronized, wait和notifyAll
使用Lock 和 Condition
使用Semaphore 等。


本文采用Lock 和 Condition来实现。

程序源代码:

package my.thread.test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 一个线程打印 1~52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。
 * 
 * @author Eric
 * 
 */
public class ThreadCommunicationTest {

	private final Lock lock = new ReentrantLock();

	private final Condition conditionA = lock.newCondition();
	private final Condition conditionB = lock.newCondition();

	private static char currentThread = 'A';

	public static void main(String[] args) {

		ThreadCommunicationTest test = new ThreadCommunicationTest();

		ExecutorService service = Executors.newCachedThreadPool();

		service.execute(test.new RunnableA());
		service.execute(test.new RunnableB());

		service.shutdown();

	}

	private class RunnableA implements Runnable {

		public void run() {
			for (int i = 1; i <= 52; i++) {
				lock.lock();

				try {
					while (currentThread != 'A') {
						try {
							conditionA.await();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}

					System.out.println(i);
					if (i % 2 == 0) {
						currentThread = 'B';
						conditionB.signal();
					}
				} finally {
					lock.unlock();
				}
			}

		}

	}

	private class RunnableB implements Runnable {

		@Override
		public void run() {
			for (char c = 'A'; c <= 'Z'; c++) {
				lock.lock();
				try {
					while (currentThread != 'B') {
						try {
							conditionB.await();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}

					System.out.println(c);
					currentThread = 'A';
					conditionA.signal();
				} finally {
					lock.unlock();
				}
			}

		}

	}
}



程序运行结果:

1
2
A
3
4
B
5
6
C
7
8
D
9
10
E
11
12
F
13
14
G
15
16
H
17
18
I
19
20
J
21
22
K
23
24
L
25
26
M
27
28
N
29
30
O
31
32
P
33
34
Q
35
36
R
37
38
S
39
40
T
41
42
U
43
44
V
45
46
W
47
48
X
49
50
Y
51
52
Z
0
2
分享到:
评论

相关推荐

    java多线程、通信机制、Thread类以及Runnable接口间的使用实例

    1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。 学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两个不同的时间间隔( 1 秒和 3 秒)在屏幕上显示当前时间。...

    1-客户端健壮性测试.81e0e000-bc85-11e7-9a52-9bd0f40b56c0.pdf

    "1-客户端健壮性测试.81e0e000-bc85-11e7-9a52-9bd0f40b56c0.pdf"这个文档中,作者郭舜提到,客户端健壮性测试的挑战主要包括:后台接口的微调可能导致客户端崩溃,异常数据集和状态会增加线上Crash率,以及人工测试...

    达内 coreJava 习题答案

    其中a为1至9之中的一个数,项数也要可以指定。 import java.util.Scanner; class Multinomial{ public static void main(String[] args){ int a; //定义输入的 a int howMany; //定义最后的一项有多少个数字 ...

    MP100打印模块使用手册

    - **0A**:打印并换行,用于控制打印头移动到下一行开始新的打印任务。 - **0D**:打印回车,将打印位置返回到当前行的起始位置。 - **1B4An**:向前走纸n点行,用于调整打印位置。 - **1B4Bn**:反向走纸n点行...

    Screenshot_2019-11-15-13-34-57-96_860bc48c3aad114ac1ee206f23d5a6f5.png

    1.程序中的else子句总是与离它最近的前面一个if子句配对 2.变量一定要赋值 第五课 条件表达式 1.&lt;表达式1&gt;​?&lt;表达式2&gt;:&lt;表达式3&gt; 第六课 switch语句 1执行过程为:先计算表达式的值,然后从前往后依次与case...

    4-自动化体系建设.66e4f510-bc86-11e7-9a52-9bd0f40b56c0.pdf

    自动化测试体系建设是提高软件测试效率和质量的重要手段,在互联网行业中尤为关键。孟国军在其介绍中提出了一系列关于如何建设和维护服务端自动化测试体系的策略和工具。下面将基于提供的文件内容,详细解析这些知识...

    assets_e4b6f25e1c38b56b464c56c31c1a361d.mp4

    assets_e4b6f25e1c38b56b464c56c31c1a361d.mp4

    2-问道移动测试在线录制技术.d39ea030-bc85-11e7-9a52-9bd0f40b56c0.pdf

    为了解决这些问题,竹逊,一位在阿里云担任高级开发工程师的专业人士,提出了在线录制技术的概念,旨在通过技术手段降低测试成本,提升测试效率。 在线录制技术的核心思想是简化自动化测试脚本的创建过程,使得非...

    PrintTest04.java

    Java开发工程师面试题通过多线程的wait()、和notify()实现12A34B56C78D910操作

    Windows Phone 7代码泄露,Windows Phone 7 build 7.0.0.6077

    xde_nk\33e56942-4f86-4b44-a9cd-1b2a84b508a8.dsm - xde_nk - 7.0.0.6077 OEMXIPKERNEL\19d4441e-9352-8e98-266c-f387d94e0f4f.dsm - OEMXIPKERNEL - 7.0.0.6077 MSXIPKERNELLTK\42d1aab7-6dfa-4c03-9797-d66f...

    教材3.7、课堂练习2题参考解答1

    - `DB 'BUFB', 2 DUP ('$')` - 定义了一个名为BUFB的字符串,内容为"BUFB$",以及两个'$'字符 根据这些信息: (1)数据在存储单元中的存放形式如下: ``` 地址 | 数据 0000H | 0DH 0001H | 0AH 0002H | 19H (25的...

    AIR-CT2500-K9-8-5-182-0.aes

    AIR-CT2500-K9-8-5-182-0.aes WLC 2504固件,配合AIR-CT...SHA512 Checksum : 8de868143326d027b175f99801287b7e65d0d4dced47c40a77fd7142d2eded1cceeda53e17813e13efaa4d27bd6eebc4158f9e9c23965f2f64b56f291b623486

    火狐Firefox 3.6.12 网页开发专版 [免费版]

    {7067a92c-1db4-4e5e-869c-25f841287f8b} {752a85d4-68d6-48ae-ab7d-6640f5f75d85} {7f57cf46-4467-4c2d-adfa-0cba7c507e54} {8620c15f-30dc-4dba-a131-7c5d20cf4a29} {8E812B7E-0FF3-11DD-9194-8F9555D89593} {8f8...

    shell脚本练习题

    下面将逐一解析这些练习题涉及的关键知识点。 ### 练习一:向用户问候及统计用户数量 这个练习的目标是读取 `/etc/passwd` 文件中的每一行,提取用户名和用户ID,并向每个用户发送问候语,同时统计用户总数。这里...

    2021年人教版一年级数学上册第二次月考试卷(可打印).pdf

    由于提供的文件内容看起来是一份一年级数学试卷的部分内容,但其中包含大量的数字、符号和字母,这些内容并未形成完整的句子或段落,且部分数字和符号序列缺乏上下文,难以理解其代表的具体数学概念或题目类型。...

    QT2.8职业版.zip

    -&lt;macro name="F12" guid="{7016AAD1-1A1C-4301-9441-1DB8A854E81E}" hidden="true" color="4278246655" original="true"&gt; -返回" guid="{7AF3E12D-61FB-415C-9AB8-BFA1CD833488}" hidden="false" color=...

    EXCEL常用公式

    - 这是一个数组函数,输完后要按Ctrl+Shift+Enter组合键(产生“{……}”)。 - “{ }”不能手工输入,只能用组合键产生。 #### 八、根据出生日期自动计算周岁 **公式**: `=TRUNC((DAYS360(D3,NOW()))/360,0)` *...

    【免费下载】操作系统第一章练习题 答案.pdf

    如“2B12A22C32D42D52A62C72C82C3D13A23D33C43C53C63C73D83C4B14D24A34B44B54A64B74D84B5C15B25A35B45A55D65B75C85D6D16D26A36B46B56A66C76B86C8D18C28C38B48C58D68B78A887B17A27C37B47D57B67B77B87D9B19B29A39B49C...

    接口_PCI-E总线引脚定义.pdf

    - **通道**:PCI-E采用的是通道(lane)的概念,一个通道由一对发送线和一对接收线组成。 - **x1/x4/x8/x16**:这些数字代表了不同数量的通道数,即PCI-E的带宽等级。例如,x16表示有16个通道,提供最高的带宽。 ##...

Global site tag (gtag.js) - Google Analytics