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