题目描述:
写两个线程,一个线程打印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 ru