我以这种方式创建了一个runnable:
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
)不是空的,如果不是,我会删除第一个元件。但是,有时候,我在java.util.NoSuchElementException
电话上有一个removeFirst()
。
有人能解释我为什么吗?
答案 0 :(得分:1)
LinkedList
不是线程安全的,可能这会导致代码中产生意外结果。
在这种情况下,当您尝试访问线程中的列表时,需要使用ConcurrentLinkedQueue
。请看一下,我想这就是你需要的。