4,启动 3个线程打印递增的数字, 线程 1先打印 1,2,3,4,5 然后是线程 2打印 6,7,8,9,10 然后是线程 3打印 11,12,13,14,15.接着再由线程 1打印 16,17,18,19,20....以此类 推, 直到打印到 75。需要代码
时间: 2024-09-11 12:16:16 浏览: 117
为了实现上述的线程打印需求,我们可以使用 Java 中的 `synchronized` 关键字来控制线程的执行顺序。下面是一个可能的实现方法:
```java
public class PrintOrder {
private static final int LAST_NUMBER = 75;
private static int currentNumber = 1;
private static Object lock = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(new NumberPrinter(1));
Thread t2 = new Thread(new NumberPrinter(2));
Thread t3 = new Thread(new NumberPrinter(3));
t1.start();
t2.start();
t3.start();
}
static class NumberPrinter implements Runnable {
private final int threadId;
public NumberPrinter(int threadId) {
this.threadId = threadId;
}
@Override
public void run() {
while (currentNumber <= LAST_NUMBER) {
synchronized (lock) {
if (currentNumber <= LAST_NUMBER && (currentNumber % 5 == 1 || currentNumber % 5 == 6 || currentNumber % 5 == 11)) {
System.out.println("Thread-" + threadId + ": " + currentNumber);
currentNumber++;
lock.notifyAll(); // 通知所有线程
} else {
try {
lock.wait(); // 等待
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
}
}
}
```
在这个代码中,我们定义了一个名为 `PrintOrder` 的类,它包含一个 `main` 方法,用于启动三个线程。每个线程都是 `NumberPrinter` 类的一个实例,该类实现了 `Runnable` 接口。每个线程在打印自己的数字序列时,都需要检查当前数字是否符合它的打印规则(即每次轮到该线程打印时,数字应该是 1, 6, 11, 16... 或者 6, 11, 16... 依此类推)。每个线程在打印完自己的一组数字后,会调用 `lock.notifyAll()` 来唤醒其他等待的线程。如果当前不是该线程打印的回合,则它会调用 `lock.wait()` 进入等待状态,直到下一个回合到来。
注意:该代码中使用了 `notifyAll()` 而不是 `notify()`,因为 `notify()` 只会唤醒一个等待线程,而 `notifyAll()` 会唤醒所有等待线程。在这个特定的例子中,只有一个线程会继续执行,但这是一种更安全的做法,以避免线程饥饿的问题。
阅读全文