Java启动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....依次类推, 直到打印到60 三个线程交替打印数字
时间: 2023-07-27 19:24:20 浏览: 86
Java多线程通信:交替打印ABAB实例
好的,这是一个典型的多线程编程问题,可以使用锁和条件变量来实现。以下是一个实现该功能的 Java 代码:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class NumberPrinter {
private int printNum = 1;
private Lock lock = new ReentrantLock();
private Condition[] conditions = { lock.newCondition(), lock.newCondition(), lock.newCondition() };
private int currentThread = 0;
public void printNumbers(int threadId, int startNum) {
lock.lock();
try {
while (printNum <= 60) {
if (currentThread != threadId) {
conditions[threadId].await();
} else {
for (int i = 0; i < 5; i++) {
System.out.println("Thread " + threadId + ": " + printNum);
printNum++;
}
currentThread = (currentThread + 1) % 3;
conditions[currentThread].signal();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) {
NumberPrinter printer = new NumberPrinter();
Thread t1 = new Thread(() -> printer.printNumbers(0, 0));
Thread t2 = new Thread(() -> printer.printNumbers(1, 1));
Thread t3 = new Thread(() -> printer.printNumbers(2, 2));
t1.start();
t2.start();
t3.start();
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
其中,`NumberPrinter` 类维护了一个 `printNum` 变量表示当前需要打印的数字,一个锁 `lock` 用来保证线程安全,和一个长度为 3 的条件变量数组 `conditions` 用来协调三个线程的执行。每个线程调用 `printNumbers` 方法,进入循环,如果当前需要由该线程打印数字,就打印 5 个数字,并将 `currentThread` 更新为下一个需要打印数字的线程的 ID。否则,该线程就进入等待状态,等待其他线程通知它可以开始执行。三个线程的 `startNum` 参数分别为 0,1,2,表示它们分别从 1,6,11 开始打印数字。最后三个线程使用 `join` 方法等待所有线程执行完毕。
阅读全文