Существует ли копийная копия стека, похожая на copyonwritearraylist?

1

У меня есть два потока с глобальной переменной стека. Thread1 получает входящие сообщения и помещает их в стек. В потоке 2 проверяется, есть ли какое-либо полученное сообщение в стеке и обрабатывает его.

Но я получаю такие исключения, когда я запускаю свою программу:

java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1

java.util.EmptyStackException
    at java.util.Stack.peek(Unknown Source)
    at java.util.Stack.pop(Unknown    

Эти исключения не возникали, когда я не использовал потоки. Но внезапно возникла ситуация, когда я преобразовал свою программу в два потока. Есть ли copyonwritestack, подобный copyonwritearraylist?

  • 2
    Нет ничего, что могло бы помешать вам использовать List как стек. Вам нужно будет опубликовать код, чтобы найти ошибку.
  • 0
    @Kayaman Вы правы, хотя в эти дни я бы использовал ArrayDeque. Я использовал ArrayList в качестве стека, хотя. Это будет работать лучше, чем Stack или LinkedList.
Теги:
multithreading
stack

3 ответа

0
Лучший ответ

Это исключение, вероятно, выбрано, потому что Stack вами реализация Stack не является потокобезопасной.

Попробуйте использовать параллельную реализацию Stack, например ConcurrentLinkedDeque, которая реализует интерфейс Deque.

Кроме того, как указано в документе:

Этот интерфейс [Deque] следует использовать вместо старого класса Stack.

  • 0
    Спасибо за ваш ответ, братан!
  • 0
    Спасибо всем за помощь. Как я могу получить элемент из определенной позиции из ConcurrentLinkedDeque? Спасибо и всего наилучшего, Раджеш.
1

Возможно, вы захотите изучить этот класс: http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html

  • 0
    Спасибо за твой ответ, братан!
  • 0
    Спасибо всем за помощь. Как я могу получить элемент из определенной позиции из ConcurrentLinkedDeque? Спасибо и всего наилучшего, Раджеш.
0

Обычно для передачи сообщений используются очереди, а не стеки. И поскольку это включает в себя потоки, что-то вроде BlockingQueue или ConcurrentLinkedQueue. Причины этого заключаются в том, что если производители и потребители не будут работать с одинаковой скоростью, по крайней мере, с помощью BlockingQueue, вы можете защитить от навешивания сообщений навсегда. Очереди, в общем, защищают вас от ситуации, когда производитель опережает потребителя, а сообщение в нижней части стека никогда не появляется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню