Java 队列的并发版本需要异常
我正在编写一个实现队列接口的自定义队列。此实现是线程安全的,在某些情况下会阻塞 正常队列接口没有提到异常,因此我不能在实现中抛出任何Java 队列的并发版本需要异常,java,multithreading,concurrency,queue,blockingqueue,Java,Multithreading,Concurrency,Queue,Blockingqueue,我正在编写一个实现队列接口的自定义队列。此实现是线程安全的,在某些情况下会阻塞 正常队列接口没有提到异常,因此我不能在实现中抛出任何InterruptedException 对于这个问题,我看到了两种解决方案,但它们都不是很令人满意: 删除队列接口并引发异常。这使得需要队列的外来软件无法使用代码 抛出RuntimeException,这将产生大量令人惊讶的软件活动,我不想冒险 像ArrayBlockingQueue这样的实现设法实现Queue和BlockingQueue。这就是要走的路,还是这里
InterruptedException
对于这个问题,我看到了两种解决方案,但它们都不是很令人满意:
RuntimeException
,这将产生大量令人惊讶的软件活动,我不想冒险像
ArrayBlockingQueue
这样的实现设法实现Queue
和BlockingQueue
。这就是要走的路,还是这里有什么诀窍?你应该选择选项一
当人们希望手头有一个队列(接口)时,他们希望队列以某种方式工作。行为在接口中指定,客户机不需要担心实现或在切换时进行更改
队列的情况并非如此,如果实现此接口但引发运行时异常,则将以意外的方式打破客户机的期望外国软件要求排队正是因为他们不想被“欺骗”而得到不可互换的东西。
最好通过不实现队列来明确这一点,除非您可以在对象中透明地处理中断的异常。如果您实现的是
队列
,可能需要抛出中断的异常
,那么我猜您确实想要实现一个。如果您阅读此接口的javadoc,您会意识到Java语言设计者基本上已经说过,在阻塞队列
的上下文中,正常的队列
操作将立即成功或失败。Queue
接口提供了在add
方法无法成功时抛出IllegalStateException
或在offer
方法失败时返回false
的功能。BlockingQueue
接口引入了新的方法put
和take
以及offer
和poll
的重载变体,用于可能阻塞的操作,因此需要抛出中断异常
如果您的代码需要抛出异常,那么您必须使用运行时异常
到期。如果没有,那么您必须从异常中恢复,然后重试或其他操作。我在这里看不到任何简单的答案。在InterruptedException
的情况下,我通常只执行线程.currentThread().interrupt()
,然后退出线程。您特别关心哪些方法?出于好奇,您是否介意分享您的用例,在其中,现有的并发集合都不能为您工作?我正在编写一个BoundedBlockingQueue,使用任何类型的队列作为参数。我只找到了一个scala实现,所以我正在编写一个java实现。我特别想提供一个在运行时更改绑定的功能。供将来参考:ArrayBlockingQueue
始终是有界的,但在运行时不能更改容量。类似地,LinkedBlockingQueue
可能是有界的,但仍然不允许更改容量。我的直觉告诉我,LinkedBlockingQueue
将是一个很好的修改对象,以获得所需的行为。