要使用三个线程按顺序循环打印123三个数字,势必要控制线程的执行顺序,可以使用java.util.concurrent包中的Semaphore类来控制线程的执行顺序。
代码示例
import java.util.concurrent.Semaphore;
public class SequentialPrinting123 {
private static Semaphore sem1 = new Semaphore(1);
private static Semaphore sem2 = new Semaphore(0);
private static Semaphore sem3 = new Semaphore(0);
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
try {
for (int i = 0; i < 3; i++) { // 打印3次
sem1.acquire();
System.out.print(1);
sem2.release();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
Thread thread2 = new Thread(() -> {
try {
for (int i = 0; i < 3; i++) { // 打印3次
sem2.acquire();
System.out.print(2);
sem3.release();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
Thread thread3 = new Thread(() -> {
try {
for (int i = 0; i < 3; i++) { // 打印3次
sem3.acquire();
System.out.print(3);
sem1.release();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
thread1.start();
thread2.start();
thread3.start();
}
}
解释
1. Semaphore初始化
- sem1初始许可数为1,表示线程1可以立即执行。
- sem2和sem3初始许可数为0,表示线程2和线程3需要等待。
2. 线程1
- 获取sem1的许可(立即可以获得)。
- 打印“1”。
- 释放sem2的许可,允许线程2执行。
3. 线程2
- 获取sem2的许可(由线程1释放)。
- 打印“2”。
- 释放sem3的许可,允许线程3执行。
4. 线程3
- 获取sem3的许可(由线程2释放)。
- 打印“3”。
- 释放sem1的许可,允许线程1再次执行。
通过这种方式,三个线程可以按顺序循环打印“123”。每个线程在打印完自己的数字后,会释放下一个线程的许可,从而实现顺序控制。