并发版本的Queue需要例外

时间:2011-10-29 00:59:19

标签: java multithreading concurrency queue blockingqueue

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

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

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

  1. 删除队列界面并抛出异常。这使得代码无法用于需要队列的外国软件。

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

  3. ArrayBlockingQueue这样的实施设法实现了QueueBlockingQueue。这是要走的路,或者这里的诀窍是什么?

2 个答案:

答案 0 :(得分:2)

如果您正在实施可能需要抛出Queue的{​​{1}},那么我的猜测是您真的想要实现BlockingQueue。如果您阅读了此接口的javadoc,您将意识到Java语言设计者基本上已经说过,在InterruptedException的上下文中,正常BlockingQueue操作将立即成功或失败。如果Queue方法无法成功,Queue接口会抛出IllegalStateException,如果add方法失败,则会false返回offer。新方法puttake以及offerpoll的重载变体由BlockingQueue接口引入,用于可能阻止并因此需要的操作扔一个InterruptedException

答案 1 :(得分:1)

你应该选择第一种选择。

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

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

最好不要实现Queue,除非你能在对象中透明地处理中断的异常。