Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 队列的并发版本需要异常_Java_Multithreading_Concurrency_Queue_Blockingqueue - Fatal编程技术网

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
    将是一个很好的修改对象,以获得所需的行为。