多线程操作,建立2个线程,一个线程完成1-10数字打印,一个线程完成A-Z字母打印。要求:一旦出现字母打印,先执行。请按要求完成上述操作。
时间: 2024-10-16 16:13:43 浏览: 16
在Java中,我们可以使用`Thread`类以及`Runnable`接口或者直接继承`Thread`类来创建并管理多线程。为了满足题目要求,可以创建两个线程分别处理数字和字母的打印,并设置一个优先级高的线程来保证一旦有字母打印就先执行。这里我们使用`PriorityThread`(模拟的一个拥有优先级的线程类)来演示:
```java
import java.util.concurrent.*;
class PrintNumber implements Runnable {
private int start = 1;
private int end = 10;
@Override
public void run() {
for (int i = start; i <= end; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
class PrintLetter implements Runnable, Comparable<PrintLetter> {
private char start = 'A';
private char end = 'Z';
@Override
public void run() {
for (char c = start; c <= end; c++) {
System.out.println(Thread.currentThread().getName() + ": " + c);
}
}
@Override
public int compareTo(PrintLetter other) {
return -other.getPriority() + this.getPriority(); // 使得字母线程优先级更高
}
}
public class Main {
public static void main(String[] args) throws InterruptedException {
PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<>();
// 设置数字线程优先级较低
Thread numberThread = new Thread(new PrintNumber());
numberThread.setPriority(Thread.MIN_PRIORITY);
// 设置字母线程优先级较高
PrintLetter letterThread = new PrintLetter();
Thread letterThreadInstance = new Thread(letterThread);
letterThreadInstance.setPriority(Thread.MAX_PRIORITY);
queue.put(letterThread); // 先放入字母线程
queue.put(numberThread); // 然后放入数字线程
executorService = Executors.newSingleThreadExecutor();
executorService.execute(queue.take()); // 首先执行队列中最优先的任务
executorService.shutdown();
// 模拟等待所有任务结束
while (!executorService.isTerminated()) {
}
}
}
```
在这个例子中,我们使用了`PriorityBlockingQueue`作为任务队列,它会根据元素的优先级自动排序。然后通过`ExecutorService`执行队列中的任务。`PrintLetter`实现了`Comparable`接口并设置了更高的优先级,所以一旦队列中有字母任务,就会先执行。
阅读全文