面试宝典(五):用三个线程按顺序循环打印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"。每个线程在打印完自己的数字后,会释放下一个线程的许可,从而实现顺序控制。

相关推荐
北城笑笑1 分钟前
Server 15 ,VMware ESXi 实战指南:Ubuntu 20.04.6 版本虚拟机静态 IP 配置、分辨率固定及远程访问实践
linux·运维·ubuntu·1024程序员节
小马哥learn4 分钟前
使用 WebSocket 实现手机控制端与电脑展示端的实时通信,支持断线重连、状态同步和双向数据交互。(最优方案)
1024程序员节
Eiceblue7 分钟前
如何通过 C# 高效读写 Excel 工作表
c#·visual studio·1024程序员节
海林OneMoreTime9 分钟前
Spring Boot 配置优先级
1024程序员节
张人玉9 分钟前
WPF 触发器详解:定义、种类与示例
c#·wpf·1024程序员节·布局控件
Slow菜鸟10 分钟前
NVM 安装 (Windows版本)
nvm·1024程序员节
凉虾皮12 分钟前
2024包河初中组
学习·算法·1024程序员节
jdlxx_dongfangxing14 分钟前
C++ STL 容器与算法详解
开发语言·c++·1024程序员节
PandaCave16 分钟前
记录画图笔记
1024程序员节
前端与小赵17 分钟前
我的创作纪念日
1024程序员节