问题描述
我以这种方式创建了一个可运行对象:
I have a runnable created this way:
private Runnable _animationScriptRunnable = new Runnable() {
public void run() {
synchronized (AnimationManager.this) {
while (!_stopRunning && !_animationScriptStack.isEmpty()) {
Class key = _animationScriptStack.removeFirst();
if (isAnimationExist(key) && isAnimationActivated(key)) {
AAnimation animation = _animationsClassTable.get(key);
animation.doBeforeAnimation();
animation.onAnimationBeginning();
do {
animation.onAnimation();
} while (isAnimationActivated(key) && animation.isAnimationRecurent() && !_stopRunning);
animation.onAnimationEnding();
animation.doAfterAnimation();
}
}
}
}
};
如您所见,我检入一个同步块,确认我的堆栈(_animationScriptStack
,创建为LinkedList<Class<?>> _animationScriptStack
)不为空,如果不为空,则删除第一个元素.但是,有时候,我在removeFirst()
通话中有一个java.util.NoSuchElementException
.
As you can see, I check in a synchronized block that my stack (_animationScriptStack
, created as a LinkedList<Class<?>> _animationScriptStack
) is not empty, and if it's not, I remove the first element. But, sometimes, I have a java.util.NoSuchElementException
, on the removeFirst()
call.
有人可以解释为什么吗?
Can someone explain me why?
推荐答案
LinkedList
并非线程安全的,可能在代码中导致意外结果.
LinkedList
is not thread safe and probably this is causing un-expected results in your code.
您需要使用 ConcurrentLinkedQueue
,在这种情况下,当您尝试访问线程中的列表时.请看一下,我想这就是您所需要的.
You need to use ConcurrentLinkedQueue
in this case as you are trying to access a list in a Thread. Please look at it, I guess this is what you need.
这篇关于非空列表上的NoSuchElementException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!