У меня есть два потока с глобальной переменной стека. 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?
Это исключение, вероятно, выбрано, потому что Stack
вами реализация Stack
не является потокобезопасной.
Попробуйте использовать параллельную реализацию Stack, например ConcurrentLinkedDeque, которая реализует интерфейс Deque.
Кроме того, как указано в документе:
Этот интерфейс [Deque] следует использовать вместо старого класса Stack.
Возможно, вы захотите изучить этот класс: http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentLinkedDeque.html
Обычно для передачи сообщений используются очереди, а не стеки. И поскольку это включает в себя потоки, что-то вроде BlockingQueue или ConcurrentLinkedQueue. Причины этого заключаются в том, что если производители и потребители не будут работать с одинаковой скоростью, по крайней мере, с помощью BlockingQueue, вы можете защитить от навешивания сообщений навсегда. Очереди, в общем, защищают вас от ситуации, когда производитель опережает потребителя, а сообщение в нижней части стека никогда не появляется.
List
как стек. Вам нужно будет опубликовать код, чтобы найти ошибку.