两线程交替打印字母大小写
题目
两个线程交替打印 ABCD...Z 字母, 一个打印大写, 一个打印小写;
输出示例:
java
AbCdEfGhIjKlMnOpQrStUvWxYz
解法一
基本思路
- 创建两个线程, 一个线程打印大写字母, 一个线程打印小写字母;
- 使用
synchronized
来控制线程同步, 并使用 flag 标记当前打印字母是大写还是小写; - 使用
letter
变量来标记当前打印字母;
实现代码
java
public class TwoThreadsCrossPrintLetters {
// 锁
private static final Object LOCK = new Object();
// 标记当前打印大写还是打印小写
// true大写 false小写
private static boolean flag = true;
// 标记当前打印字母
private static char letter = 'A';
private static void printLetters(boolean isUpperCase) {
while (letter <= 'Z') {
synchronized (LOCK) {
while (flag != isUpperCase) {
// 若不论到当前线程打印 则令线程等待
try {
LOCK.wait();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
if (letter <= 'Z') {
try {
if (isUpperCase) {
System.out.print(letter);
} else {
System.out.print((char) (letter + 'a' - 'A'));
}
// 令线程休眠一秒 便于观察
Thread.sleep(1000);
++ letter;
// 当前线程打印后 轮到另外一个线程打印
flag = !flag;
LOCK.notifyAll();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(() -> printLetters(true), "t1");
Thread t2 = new Thread(() -> printLetters(false), "t2");
t2.start();
t1.start();
}
}