我正在编写实现队列接口的自定义队列。这种实现是线程安全的,在某些情况下会阻塞。
普通的Queue接口没有提到Exceptions,因此我不能在我的实现中抛出任何InterruptedException
。
我看到了这个问题的两个解决方案,但它们都不是很令人满意:
删除队列界面并抛出异常。这使得代码无法用于需要队列的外国软件。
抛出RuntimeException
,这将产生大量非常令人惊讶的软件活动,我不想冒这个风险。
像ArrayBlockingQueue
这样的实施设法实现了Queue
和BlockingQueue
。这是要走的路,或者这里的诀窍是什么?
答案 0 :(得分:2)
如果您正在实施可能需要抛出Queue
的{{1}},那么我的猜测是您真的想要实现BlockingQueue。如果您阅读了此接口的javadoc,您将意识到Java语言设计者基本上已经说过,在InterruptedException
的上下文中,正常BlockingQueue
操作将立即成功或失败。如果Queue
方法无法成功,Queue
接口会抛出IllegalStateException
,如果add
方法失败,则会false
返回offer
。新方法put
和take
以及offer
和poll
的重载变体由BlockingQueue
接口引入,用于可能阻止并因此需要的操作扔一个InterruptedException
。
答案 1 :(得分:1)
你应该选择第一种选择。
当人们想要拥有一个队列(界面)时,他们会期望队列以某种方式工作。该行为在界面中指定,客户端无需担心实现或在切换时进行更改。
您的队列不是这种情况,如果您实现此接口但抛出运行时异常,您将以意外的方式破坏客户端的期望。 外国软件正好要求队列,因为他们不想被“欺骗”以获得不可互换的东西。
最好不要实现Queue,除非你能在对象中透明地处理中断的异常。