在main方法中启动两个线程;1. 在线程A中打印1~52;2. 在线程B中打印A~Z;在控制台实现打印顺序是 12A34B…5152Z。即A线程打印2个数字后B线程打印1个字母。
时间: 2023-12-30 09:04:36 浏览: 34
以下是实现代码:
```java
public class PrintThread {
public static void main(String[] args) {
Object lock = new Object(); // 创建一个锁对象
// 线程A,打印1~52
Thread threadA = new Thread(() -> {
synchronized (lock) {
for (int i = 1; i <= 52; i += 2) {
System.out.print(i);
System.out.print(i + 1);
lock.notify(); // 唤醒线程B
try {
lock.wait(); // 让线程A等待,释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify(); // 唤醒线程B结束
}
});
// 线程B,打印A~Z
Thread threadB = new Thread(() -> {
synchronized (lock) {
for (char c = 'A'; c <= 'Z'; c++) {
System.out.print(c);
lock.notify(); // 唤醒线程A
try {
if (c != 'Z') { // 最后一个字母不用等待
lock.wait(); // 让线程B等待,释放锁
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
lock.notify(); // 唤醒线程A结束
}
});
threadA.start(); // 启动线程A
threadB.start(); // 启动线程B
}
}
```
在代码中,我们创建了一个锁对象 `lock`,然后在两个线程中都使用了 `synchronized(lock)` 来保证线程安全。在线程A中,我们使用了 `for` 循环来打印1~52,每次打印两个数字后,使用 `lock.notify()` 唤醒线程B,然后使用 `lock.wait()` 让线程A等待,释放锁。在线程B中,我们使用了 `for` 循环来打印A~Z,每次打印一个字母后,使用 `lock.notify()` 唤醒线程A,然后使用 `lock.wait()` 让线程B等待,释放锁。最后在两个线程中都使用了 `lock.notify()` 来结束另一个线程。这样就可以实现打印顺序是 12A34B…5152Z 的效果了。