我有两个带有全局堆栈变量的线程。 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
当我没有使用线程时,这些例外情况并未出现。但是,当我将程序转换为两个线程时突然出现了。是否有类似于copyonwritearraylist的copyonwritestack?
答案 0 :(得分:1)
答案 1 :(得分:0)
可能会抛出此异常,因为您选择的Stack
实现不是线程安全。
尝试使用实现ConcurrentLinkedDeque接口的Deque等堆栈的并发实现。
另外,正如文件中所述:
此接口[Deque]应优先于传统的Stack类使用。
答案 2 :(得分:0)
通常,对于消息传递,您使用队列,而不是堆栈。因为这涉及线程,比如BlockingQueue或ConcurrentLinkedQueue。这样做的原因是,如果生产者和消费者不以相同的速度运行,至少使用BlockingQueue,您可以防止永远堆积的消息。通常,队列可以保护您免受生产者位于消费者之前的情况的影响,并且堆栈底部的消息永远不会被弹出。