首页 > 解决方案 > Java中带有信号量的多线程状态

问题描述

我有一个关于在多线程 Java 代码中使用信号量的问题。

There are three threads being fired asynchronously. One of them calls zero(), the other calls even(), and the last one calls odd(). "0102" is the correct output.


Semaphore zero = new Semaphore(1);
Semaphore odd = new Semaphore(0);
Semaphore even = new Semaphore(0);

public void zero(IntConsumer printNumber) throws InterruptedException {
        for(int i = 0; i < n; i++) {
            zero.acquireInterruptibly();
            printNumber.accept(0);
            if(i % 2 == 0) {
                odd.release();
            } else {
                even.release();
            }
        }
    }

    public void even(IntConsumer printNumber) throws InterruptedException {
        for (int i = 2; i <= n; i += 2) {
            even.acquire();
            printNumber.accept(i);
            zero.release();
        }
    }

    public void odd(IntConsumer printNumber) throws InterruptedException {
        for (int i = 1; i <= n; i += 2) {
            odd.acquire();
            printNumber.accept(i);
            zero.release();
        }
    }

在上面显示的代码中,将运行的第一个函数是函数“零”,因为只需要那个锁。然后,函数 'odd' 将能够从另一个线程调用,因为它的锁已被释放,因此能够被获取。

两个问题:

1) 在锁被函数 'odd' 释放之前,获得“零”锁的同一个线程能否重新进入 for 循环

2) 在线程被切换后,for 循环的状态如何保存?

编辑:在更多地了解信号量时,我知道无论线程之前是否已获取信号量,它都无法运行,除非该信号量可用的许可数量大于 0。因此,直到数量可用许可的数量大于 0,则该函数将无法运行,直到释放该信号量以使可用许可的数量大于 0。但问题仍然存在,如何保持 for 循环的状态如此当我重新进入 for 循环时,我不会从最初的 'i' 值开始。

标签: javamultithreading

解决方案


推荐阅读