java信号量控制线程打印顺序的示例分享


在Java中,信号量(Semaphore)是一种用于控制对共享资源的访问数量的机制。它主要用于实现多个线程之间的协调。如果你想要使用信号量来控制线程打印的顺序,以下是一个简单的示例,其中两个线程将按照指定的顺序打印数字。


import java.util.concurrent.Semaphore;

public class SemaphoreOrderExample {
    // 初始化两个信号量,分别控制两个线程的执行顺序
    private static final Semaphore semaphore1 = new Semaphore(1);
    private static final Semaphore semaphore2 = new Semaphore(0);

    public static void main(String[] args) {
        // 创建并启动两个线程
        Thread thread1 = new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    semaphore1.acquire(); // 等待信号量
                    System.out.println("Thread 1: " + i);
                    semaphore2.release(); // 释放第二个信号量,允许第二个线程执行
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        Thread thread2 = new Thread(() -> {
            try {
                for (int i = 1; i <= 5; i++) {
                    semaphore2.acquire(); // 等待第二个信号量
                    System.out.println("Thread 2: " + i);
                    semaphore1.release(); // 释放第一个信号量,允许第一个线程执行
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

        // 启动线程
        thread1.start();
        // 因为需要thread1先执行,所以先给thread1的信号量放行
        semaphore1.release();

        thread2.start();
    }
}

在这个示例中,我们创建了两个信号量`semaphore1`和`semaphore2`,初始时`semaphore1`的可用许可数为1,而`semaphore2`的可用许可数为0。这样,当`thread1`启动时,它可以直接获取`semaphore1`的许可并开始执行。每当`thread1`完成一次打印后,它会释放`semaphore2`的许可,从而允许`thread2`执行。`thread2`在每次打印之前需要等待`semaphore2`的许可,并在打印完成后释放`semaphore1`的许可,以便`thread1`可以继续执行。这样,两个线程就可以交替打印,确保了打印的顺序。

注意,这个示例中,我们在`main`方法中通过`semaphore1.release();`来启动这个过程,因为我们需要确保`thread1`能够首先开始执行。如果你想要更复杂的顺序或者更多的线程参与,你可能需要调整信号量的初始值或添加更多的信号量来控制不同的执行阶段。