要使用三个线程按顺序循环打印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”。每个线程在打印完自己的数字后,会释放下一个线程的许可,从而实现顺序控制。