有队列的信号量

时间:2017-10-28 14:06:23

标签: java multithreading queue semaphore

信号量:

    public void enter() throws InterruptedException {
        synchronized (block) {
            ++current;
            if (current > permits) {
                try {
                    block.wait();
                } catch (InterruptedException e) {
                    throw e;
                }

            }
        }

    }

    public void realese() {
        synchronized (block) {
            --current;
            block.notify();
        }

    }

如何在信号量中建立队列?我希望线程按调用enter()的顺序执行。

2 个答案:

答案 0 :(得分:0)

以这种方式:

parse_str($_POST['data'], $inputValues); //$inputValues will be array with your form fields方法唤醒每个等待的线程(即release()

block.notifyAll()方法中,让每个等待的线程查看队列的头部。

  • 如果队列头部的线程是当前线程,请弹出队列并完成enter()调用,执行-OR -
  • 回去等待。

但是,我会留下一个微妙的问题,让你找出解决方法:

  • 如果线程A醒来,发现自己在队列的头部,弹出队列并返回,
  • 然后,线程B可以唤醒,在队列的头部找到 self,弹出队列并返回。

你有一个enter()来电,只允许两个线程到release()

那会很糟糕。因此,您需要找到一种方法来保证每次调用enter()时,只有一个线程可以完成enter()调用。

答案 1 :(得分:0)

如果您使用newer java,则可以向构造函数添加公平性设置。

Semaphore(int permits, boolean fair)
像这样

private final Semaphore available = new Semaphore(MAX_AVAILABLE, true);