java 写两个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序是12A34B...
时间: 2023-11-12 16:03:39 浏览: 99
下面是一种实现方式:
```java
public class PrintThread implements Runnable {
private static Object lock = new Object();
private int threadId;
private static int count = 1;
private static char letter = 'A';
public PrintThread(int id) {
this.threadId = id;
}
@Override
public void run() {
synchronized (lock) {
while (count <= 52 && letter <= 'Z') {
if (threadId == 1) {
System.out.print(count++);
System.out.print(count++);
lock.notifyAll();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.print(letter++);
lock.notifyAll();
try {
if (letter <= 'Z') {
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
PrintThread p1 = new PrintThread(1);
PrintThread p2 = new PrintThread(2);
new Thread(p1).start();
new Thread(p2).start();
}
}
```
解释一下上面的代码:
1. 使用一个静态对象 lock 作为锁,保证两个线程的互斥执行;
2. 使用 count 和 letter 分别记录当前需要打印的数字和字母;
3. 在每轮循环中,首先判断是否已经打印完了,如果没有,则分别判断当前线程的编号,执行打印操作,并使用 notifyAll() 唤醒等待的线程;
4. 在打印数字的线程中,打印两个连续的数字,并在打印完后等待,直到字母线程唤醒它;
5. 在打印字母的线程中,打印一个字母,并在打印完后等待,直到数字线程唤醒它;
6. 最后退出循环,结束线程。
阅读全文