题目:一个线程打印 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
分享到:
相关推荐
1. 写两个线程,一个线程打印1-52,另一个线程打印字母A-Z。打印顺序为12A34B56C……5152Z。 学习线程之间的通信协调关系。 2. 使用 runnable 接口实现按两个不同的时间间隔( 1 秒和 3 秒)在屏幕上显示当前时间。...
"1-客户端健壮性测试.81e0e000-bc85-11e7-9a52-9bd0f40b56c0.pdf"这个文档中,作者郭舜提到,客户端健壮性测试的挑战主要包括:后台接口的微调可能导致客户端崩溃,异常数据集和状态会增加线上Crash率,以及人工测试...
其中a为1至9之中的一个数,项数也要可以指定。 import java.util.Scanner; class Multinomial{ public static void main(String[] args){ int a; //定义输入的 a int howMany; //定义最后的一项有多少个数字 ...
- **0A**:打印并换行,用于控制打印头移动到下一行开始新的打印任务。 - **0D**:打印回车,将打印位置返回到当前行的起始位置。 - **1B4An**:向前走纸n点行,用于调整打印位置。 - **1B4Bn**:反向走纸n点行...
1.程序中的else子句总是与离它最近的前面一个if子句配对 2.变量一定要赋值 第五课 条件表达式 1.<表达式1>?<表达式2>:<表达式3> 第六课 switch语句 1执行过程为:先计算表达式的值,然后从前往后依次与case...
自动化测试体系建设是提高软件测试效率和质量的重要手段,在互联网行业中尤为关键。孟国军在其介绍中提出了一系列关于如何建设和维护服务端自动化测试体系的策略和工具。下面将基于提供的文件内容,详细解析这些知识...
assets_e4b6f25e1c38b56b464c56c31c1a361d.mp4
为了解决这些问题,竹逊,一位在阿里云担任高级开发工程师的专业人士,提出了在线录制技术的概念,旨在通过技术手段降低测试成本,提升测试效率。 在线录制技术的核心思想是简化自动化测试脚本的创建过程,使得非...
Java开发工程师面试题通过多线程的wait()、和notify()实现12A34B56C78D910操作
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...
- `DB 'BUFB', 2 DUP ('$')` - 定义了一个名为BUFB的字符串,内容为"BUFB$",以及两个'$'字符 根据这些信息: (1)数据在存储单元中的存放形式如下: ``` 地址 | 数据 0000H | 0DH 0001H | 0AH 0002H | 19H (25的...
AIR-CT2500-K9-8-5-182-0.aes WLC 2504固件,配合AIR-CT...SHA512 Checksum : 8de868143326d027b175f99801287b7e65d0d4dced47c40a77fd7142d2eded1cceeda53e17813e13efaa4d27bd6eebc4158f9e9c23965f2f64b56f291b623486
{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...
下面将逐一解析这些练习题涉及的关键知识点。 ### 练习一:向用户问候及统计用户数量 这个练习的目标是读取 `/etc/passwd` 文件中的每一行,提取用户名和用户ID,并向每个用户发送问候语,同时统计用户总数。这里...
由于提供的文件内容看起来是一份一年级数学试卷的部分内容,但其中包含大量的数字、符号和字母,这些内容并未形成完整的句子或段落,且部分数字和符号序列缺乏上下文,难以理解其代表的具体数学概念或题目类型。...
-<macro name="F12" guid="{7016AAD1-1A1C-4301-9441-1DB8A854E81E}" hidden="true" color="4278246655" original="true"> -返回" guid="{7AF3E12D-61FB-415C-9AB8-BFA1CD833488}" hidden="false" color=...
- 这是一个数组函数,输完后要按Ctrl+Shift+Enter组合键(产生“{……}”)。 - “{ }”不能手工输入,只能用组合键产生。 #### 八、根据出生日期自动计算周岁 **公式**: `=TRUNC((DAYS360(D3,NOW()))/360,0)` *...
如“2B12A22C32D42D52A62C72C82C3D13A23D33C43C53C63C73D83C4B14D24A34B44B54A64B74D84B5C15B25A35B45A55D65B75C85D6D16D26A36B46B56A66C76B86C8D18C28C38B48C58D68B78A887B17A27C37B47D57B67B77B87D9B19B29A39B49C...
- **通道**:PCI-E采用的是通道(lane)的概念,一个通道由一对发送线和一对接收线组成。 - **x1/x4/x8/x16**:这些数字代表了不同数量的通道数,即PCI-E的带宽等级。例如,x16表示有16个通道,提供最高的带宽。 ##...