面试宝典(五):用三个线程按顺序循环打印123三个数字,比如123123123

要使用三个线程按顺序循环打印123三个数字,势必要控制线程的执行顺序,可以使用java.util.concurrent包中的Semaphore类来控制线程的执行顺序。

代码示例

java 复制代码
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需要等待。
  1. 线程1
  • 获取sem1的许可(立即可以获得)。
  • 打印"1"。
  • 释放sem2的许可,允许线程2执行。
  1. 线程2
  • 获取sem2的许可(由线程1释放)。
  • 打印"2"。
  • 释放sem3的许可,允许线程3执行。
  1. 线程3
  • 获取sem3的许可(由线程2释放)。
  • 打印"3"。
  • 释放sem1的许可,允许线程1再次执行。

通过这种方式,三个线程可以按顺序循环打印"123"。每个线程在打印完自己的数字后,会释放下一个线程的许可,从而实现顺序控制。

相关推荐
0和1的舞者1 小时前
网络通信的奥秘:HTTP详解 (七)
服务器·网络·网络协议·http·okhttp·软件工程·1024程序员节
liu****5 小时前
12.线程(二)
linux·开发语言·c++·1024程序员节
小苏兮11 小时前
【把Linux“聊”明白】编译器gcc/g++与调试器gdb/cgdb:从编译原理到高效调试
java·linux·运维·学习·1024程序员节
unable code13 小时前
攻防世界-Misc-掀桌子
网络安全·ctf·misc·1024程序员节
被AI抢饭碗的人1 天前
linux:io基础
1024程序员节
GIS数据转换器1 天前
2025无人机在电力交通中的应用实践
运维·人工智能·物联网·安全·无人机·1024程序员节
TDengine (老段)1 天前
TDengine 数学函数 CRC32 用户手册
java·大数据·数据库·sql·时序数据库·tdengine·1024程序员节
草莓熊Lotso2 天前
C++ 继承特殊场景解析:友元、静态成员与菱形继承的底层逻辑
服务器·开发语言·c++·人工智能·经验分享·笔记·1024程序员节
-孤存-2 天前
深入浅出:TCP/UDP协议核心原理
网络·网络协议·tcp/ip·1024程序员节
百锦再2 天前
第1章 Rust语言概述
java·开发语言·人工智能·python·rust·go·1024程序员节