如果信号灯上没有可用的许可证,我需要实现FIFO队列。 我的教授指定,在考试期间,我们将只能使用acquire()
和release()
方法。 我的想法是使用tryAcquire()
方法实现一个 LinkedList,如果结果为 false,则会在列表底部添加 currentThread。 无法使用我搜索的tryAcquire()
方法,我注意到了这个结构。 如果我初始化信号灯,例如:
Semaphore example = new Semaphore(5, true);
如果线程尝试在已用尽其许可的信号量上使用acquire()
方法,会发生什么情况?它会自动创建队列吗?我是否必须以任何方式处理它或该过程是自动的?
java文档不是以这种方式显式的吗?
它说线程调用acquire
将被阻止,直到许可证可用,而不是返回 false 的tryAcquire
- 这意味着没有许可证,但调用此方法的线程不会阻止。
公平是相关的。如果已经有等待线程,但您通过当前线程tryAcquire
,它将忽略公平性并获得该许可。由于您不被允许使用它,因此公平性是您正在寻找的FIFO队列。从字面上看,来自文档:
当公平性设置为 true 时,信号量保证选择调用任何获取方法的线程,以按照其对这些方法的调用的处理顺序(先进先出;先进先出)
如果有阻塞的线程,取消阻止它们的两种方法是通过release
添加许可或中断线程 - 我认为您不想这样做。