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

相关推荐
玛哈特-小易4 小时前
玛哈特矫平机:精密制造中的平整大师
制造·微信公众平台·1024程序员节·矫平机
惜.己1 天前
Jmeter中的断言(二)
测试工具·jmeter·1024程序员节
西电研梦2 天前
考研倒计时30天丨和西电一起向前!再向前!
人工智能·考研·1024程序员节·西电·西安电子科技大学
惜.己2 天前
Jmeter中的断言(四)
测试工具·jmeter·1024程序员节
·云扬·2 天前
Java IO 与 BIO、NIO、AIO 详解
java·开发语言·笔记·学习·nio·1024程序员节
网安_秋刀鱼2 天前
PHP代码审计 --MVC模型开发框架&rce示例
开发语言·web安全·网络安全·php·mvc·1024程序员节
HUODUNYUN2 天前
小程序免备案:快速部署与优化的全攻略
服务器·网络·web安全·小程序·1024程序员节
惜.己3 天前
Jmeter的后置处理器(二)
测试工具·github·1024程序员节
惜.己3 天前
Jmeter中的断言(一)
测试工具·jmeter·1024程序员节
cainiao0806053 天前
《物理学进展》
1024程序员节·核心期刊·知网期刊·职称评审