多线程操作, 建立2个线程, 一个线程完成1-10数字打印, 一个线程完成A-Z字母打印。要求: 一旦出现字母打印, 先执行。请按要求完成上述操作。
时间: 2024-10-16 10:13:18 浏览: 21
在Java中,我们可以使用`Thread`类以及`synchronized`关键字或者`java.util.concurrent`包下的`Semaphore`来实现这个需求,因为我们需要保证当一个线程正在打印字母时,数字打印线程会被阻塞直到字母线程结束。这里是一个简单的示例:
```java
import java.util.concurrent.Semaphore;
public class PrintThreads {
private final Semaphore letterLock = new Semaphore(1); // 控制字母打印
private int numberCounter = 1;
private char letterCounter = 'A';
class NumberPrinter implements Runnable {
@Override
public void run() {
while (numberCounter <= 10) {
System.out.println(numberCounter++);
try {
letterLock.acquire(); // 获取锁,等待字母线程完成
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
class LetterPrinter implements Runnable {
@Override
public void run() {
while (true) {
synchronized (PrintThreads.this) { // 自己内部同步,保证不会同时打印两个字母
if (letterCounter > 'Z') break; // 打印完所有字母退出
System.out.print(letterCounter++);
PrintThreads.this.notify(); // 通知其他线程可以继续
try {
PrintThreads.this.wait(); // 等待被唤醒
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
}
public static void main(String[] args) {
PrintThreads printThreads = new PrintThreads();
Thread numberThread = new Thread(printThreads.new NumberPrinter(), "Number Printer");
Thread letterThread = new Thread(printThreads.new LetterPrinter(), "Letter Printer");
numberThread.start();
letterThread.start();
}
}
```
在这个例子中,`LetterPrinter`线程持有`letterLock`信号量,每次打印一个字母后会释放它,让`NumberPrinter`线程获取并继续打印数字。如果`LetterPrinter`线程打印完所有字母,它会停止自身循环,并等待`NumberPrinter`线程释放锁。
阅读全文