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