如果信号量上没有可用的许可,我需要实现FIFO队列。我的教授已经明确指出,在考试期间,我们只能使用acquire()和release()方法。我的想法是使用LinkedList方法实现tryAcquire(),如果结果为false,则在列表底部添加currentThread。由于无法使用我搜索的tryAcquire()方法,我注意到了这个构造。例如,如果我初始化一个信号量:
Semaphore example = new Semaphore(5, true);如果线程试图在耗尽其许可的信号量上使用acquire()方法,会发生什么情况?它会自动创建队列吗?我必须以任何方式处理它还是过程是自动的?
发布于 2018-01-23 14:03:01
java文档不是以这种方式显式的吗?
它说线程调用acquire将被阻塞,直到许可可用,而不是返回false的tryAcquire,这意味着没有许可证,但是线程调用这个方法不会阻塞。
公平是相关的。如果已经有等待线程,但您通过当前线程进行tryAcquire,则它将忽略公平性并获得该许可。由于不允许使用它,所以公平性是您要寻找的FIFO队列。从医生那里说:
当公平设置为真时,信号量保证调用任何获取方法的线程被选中以按照它们对这些方法的调用的顺序获得许可(先入先出;FIFO)。
如果有阻塞的线程,取消阻塞它们的两种方法是通过release添加许可或中断线程--我认为这是您不想要的。
https://stackoverflow.com/questions/48401242
复制相似问题