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

相关推荐
unable code2 天前
磁盘取证-Flying_High
网络安全·ctf·misc·1024程序员节·磁盘取证
unable code3 天前
磁盘取证-ColorfulDisk
网络安全·ctf·misc·1024程序员节·内存取证
unable code4 天前
磁盘取证-[第十章][10.1.2 磁盘取证方法]磁盘取证1
网络安全·ctf·misc·1024程序员节·内存取证
开开心心就好5 天前
免费抽奖工具支持批量导入+自定义主题
linux·运维·服务器·macos·pdf·phpstorm·1024程序员节
开开心心就好9 天前
卸载工具清理残留,检测垃圾颜色标识状态
linux·运维·服务器·python·安全·tornado·1024程序员节
子燕若水10 天前
Facebook reels 运营指南
1024程序员节
尘觉13 天前
创作 1024 天|把热爱写成长期主义
数据库·1024程序员节
写点什么呢14 天前
Word使用记录
word·1024程序员节
开开心心就好14 天前
内存清理工具点击清理,自动间隔自启
linux·运维·服务器·安全·硬件架构·材料工程·1024程序员节
开开心心就好15 天前
内存清理工具开源免费,自动优化清理项
linux·运维·服务器·python·django·pdf·1024程序员节