Параллельная версия очереди нуждается в исключениях - PullRequest
1 голос
/ 29 октября 2011

Я пишу пользовательскую очередь, реализующую интерфейс очереди.Эта реализация является поточно-ориентированной и в некоторых случаях блокируется.

В обычном интерфейсе очереди не упоминаются исключения, поэтому я не могу выбросить InterruptedException в своей реализации.

Я вижу два решениядля этой проблемы, но оба они не очень удовлетворяют:

  1. Удалите интерфейс очереди и выбросите исключения.Это делает код непригодным для иностранного программного обеспечения, которому требуется Очередь.

  2. Бросок RuntimeException, это приведет к тоннам очень удивительной программной активности, которой я не хочу рисковать.

Каким-то образом реализации, такие как ArrayBlockingQueue, способны реализовать Queue и BlockingQueue.Это путь, или в чем тут хитрость?

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Если вы реализуете Queue, для которого может потребоваться выбросить InterruptedException, то я предполагаю, что вы действительно хотите реализовать BlockingQueue .Если вы прочтете javadoc для этого интерфейса, вы поймете, что разработчики языка Java в основном говорили, что в контексте BlockingQueue нормальные операции Queue либо завершатся успешно, либо сразу завершатся с ошибкой.Интерфейс Queue предусматривает выдачу IllegalStateException, если метод add не может быть успешным, или возврат false, если метод offer завершается неудачей.Новые методы put и take, а также перегруженный вариант offer и poll введены интерфейсом BlockingQueue для операций, которые могут блокировать, и для этого необходимо выбросить InterruptedException.

1 голос
/ 29 октября 2011

Вы должны перейти с первого варианта.

Когда люди хотят иметь Очередь (интерфейс) под рукой, они ожидают, что очередь будет работать определенным образом. Поведение указывается в интерфейсе, и клиенту не нужно беспокоиться о реализации или вносить изменения при переключении.

Это не относится к вашей очереди, если вы реализуете этот интерфейс, но выдает исключение времени выполнения, вы неожиданно нарушите ожидание вашего клиента. Иностранные программы запрашивают очередь именно потому, что не хотят, чтобы их "обманули", чтобы получить что-то не взаимозаменяемое. Лучше сделать это явным, не реализуя очередь, если только вы не можете прозрачно обработать прерванное исключение внутри вашего объекта.

...