题目描述:
写两个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序是12A34B....5152Z
分析:
两个线程,一个负责打印数字,一个负责打印字母,细心的我发现字母是26个,数字是52个,两者是2倍的关系,而且打印的结果中两个数(可以使十位的)配一个字母,所以可以利用循环进行打印,循环26次即可。
这里我们用两个锁,用锁的目的就是线程各自进行,互不打扰,当到临界条件时,我不能进行,你也不能进行,完成分配。
算法:
- 定义两个变量,一个是标识flag,一个是数字符count。flag = false;
- 先进行数字的打印,一个是判断flag的循环,若满足条件我们让他等待,等待字母行打印,怒然他进行数字的打印。
- 之后跳转到字母打印行,同样,满足条件先进行数字打印,不然进行字母打印。
字母怎么通过count来转换,因为我们是运用count来实现对整个进程的控制,所以字母也应该受到count的控制,我们利用强制转换类型进行转换。
char a = (char)(count +'A' - 1)
线程循环的执行我们用一下代码实现:
thread s = new thread();
new Thread(() -> {
for (int i = 0; i < 26; i++) {
s.runNum();
s.runWord();
}
}).start();
综合以上,实现代码如下:
class thread {
private boolean flag = false;
private int count = 1;
public synchronized void runNum() {
try {
while (flag != false) {
wait();
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.print(2 * count - 1);
System.out.print(2 * count);
flag = true;
notify();
}
public synchronized void runWord() {
try {
while (flag != true) {
wait();
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.print((char) (count + 'A' - 1));
count++;
flag = false;
notify();
}
}
public class MyThread {
public static void main(String[] args) {
thread s = new thread();
new Thread(() -> {
for (int i = 0; i < 26; i++) {
s.runNum();
s.runWord();
}
}).start();
}
}
输出:

这篇博客介绍了如何创建两个线程,一个打印1到52,另一个打印A到Z,按照12A34B...5152Z的顺序。博主分析了线程间的关系,指出数字和字母数量的比例,并提出了使用锁来确保线程同步。通过设置标志变量和计数器,实现了数字和字母交替打印的算法。最后展示了具体的实现代码。

1万+

被折叠的 条评论
为什么被折叠?



