1

我正在编写一个实现队列接口的自定义队列。此实现是线程安全的,并且在某些情况下会阻塞。

普通的 Queue 接口没有提到异常,因此我不能InterruptedException在我的实现中抛出任何异常。

我看到了这个问题的两种解决方案,但它们都不是很令人满意:

  1. 移除 Queue 接口并抛出异常。这使得代码无法用于需要队列的外国软件。

  2. Throw RuntimeException,这将产生大量非常令人惊讶的软件活动,我不想冒险。

不知何故,诸如ArrayBlockingQueue设法实现QueueBlockingQueue. 这是要走的路,还是这里的诀窍是什么?

4

2 回答 2

2

如果你正在实现一个Queue可能需要抛出一个的,InterruptedException那么我的猜测是你真的想要实现一个BlockingQueue。如果您阅读此接口的 javadoc,您会意识到 Java 语言设计者基本上说过,在BlockingQueue正常Queue操作的上下文中,要么立即成功,要么立即失败。该Queue接口提供了IllegalStateExceptionadd方法不能成功时抛出一个或falseoffer方法失败时返回。接口引入了新方法put以及和take的重载变体,用于可能阻塞并因此需要抛出.offerpollBlockingQueueInterruptedException

于 2011-10-29T03:53:25.277 回答
1

你应该选择选项一。

当人们想要拥有一个队列(接口)时,他们会期望队列以某种方式工作。行为在接口中指定,客户端在切换时无需担心实现或进行更改。

您的队列并非如此,如果您实现此接口但抛出运行时异常,您将以意想不到的方式打破客户的期望。国外的软件要求一个队列正是因为他们不想被“欺骗”以获得不可互换的东西。

最好通过不实现队列来明确这一点,除非您可以在对象中透明地处理中断的异常。

于 2011-10-29T03:31:14.433 回答