1

私はこの方法で実行可能なものを作成しました:

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.NoSuchElementExceptionremoveFirst()ます。

誰かが私に理由を説明できますか?

4

1 に答える 1

2

LinkedListはスレッドセーフではなく、おそらくこれがコードに予期しない結果を引き起こしている可能性があります。

ConcurrentLinkedQueueこの場合、スレッド内のリストにアクセスしようとしているので、を使用する必要があります。それを見てください、私はこれがあなたが必要としているものだと思います。

于 2012-09-09T18:44:41.353 に答える