在java中使用Semaphores并存储到数组

时间:2016-10-29 15:23:24

标签: java multithreading semaphore

我是新手使用信号量,所以请耐心等待。所以,假设我有7个许可证,总共有49人(线程)等待他们。如果我获取()前7个人的信号量并将它们存储到列表数组(存储人的信号量)中,例如将它们传递给另一个类。然后,如果我回到该数组并循环并释放()其他类中的信号量,那么不应该触发其他线程等待获取下一个键吗?因为我刚刚编写的代码执行了此操作,接下来的7个线程没有获取密钥。我没有发布代码,因为我只是想在概念上理解我错过的内容,然后实现它。

2 个答案:

答案 0 :(得分:2)

如果您想要的是一次最多有7个线程处于活动状态, 你只需要1个信号量,就像这样:

Semaphore available = new Semaphore(7, true);

让每个线程调用 available.acquire()(并最终 available.release()),针对这个非常信号量的实例(由所有线程共享) ),就是这样。

以下是java.util.concurrent.Semaphore javadoc所说的内容:

  

计数信号量。从概念上讲,信号量维护着一组   许可证。如果需要,每个acquire()都会阻止,直到许可证为止   可用,然后接受它。每个版本()都会添加许可证,   可能释放阻塞收购者。   但是,没有使用实际的许可对象;   信号量只保留数字   可用并采取相应行动。

答案 1 :(得分:0)

如果您要获取信号量,请确保也将其释放。 前伪代码:

sem = Semaphore.new(2, true)
Thread1 { 
    sem.acquire()
    // Do something
    sem.release()
    }; 
Thread2 { 
    sem.acquire()
    // Do something
    sem.release()
    }
Thread3 { 
    //blocked until one of the first two Thread releases. 
    sem.acquire()
    // Do something
    sem.release()
    }

这增加了齐柏林飞艇的观点...