0

スレッドセーフなストップウォッチを作成する方法を知りたいです。以下は単純なストップウォッチの実装で、ストップウォッチの基本的な操作を提供しますが、スレッドセーフではありません。

今考えられるのは、各メソッド (start()、lap()、stop()、reset()) に同期を追加することだけです。ストップウォッチでスレッドセーフを実現する他の方法はありますか?

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class Stopwatch {
    private long startTime;
    private long endTime;
    private boolean isRunning;

    // lapTimes is able to record all the lap time.
    private CopyOnWriteArrayList<Long> lapTimes;

    Stopwatch() {
        isRunning = false;
        lapTimes = new CopyOnWriteArrayList<Long>();
    }

    public void start() {
        if (!isRunning) {
            isRunning = true;
            startTime = System.currentTimeMillis();
        } else {
            throw new IllegalStateException("cannot start when running!");
        }
    }

    public void lap() {
        if (isRunning) {
            endTime = System.currentTimeMillis();
            lapTimes.add(endTime - startTime);
            startTime = endTime;
        } else {
            throw new IllegalStateException("cannot lap when not running!!");
        }
    }

    public void stop() {
        if (isRunning) {
            endTime = System.currentTimeMillis();
            lapTimes.add(endTime - startTime);
            isRunning = false;
        } else {
            throw new IllegalStateException("cannot stop when not running!");
        }
    }

    public void reset() {
        isRunning = false;
        lapTimes.clear();
    }

    public List<Long> getLapTime() {
        return lapTimes;
    }

}

私がやりたいことは、1 つのストップウォッチ オブジェクトを複数のスレッドで共有することです。

スレッド A とスレッド B の 2 つのスレッドがあるとします。スレッド A はストップウォッチを開始し、数秒遅れて停止を呼び出します。if文(stopメソッドの1行目)が終わったところで、スレッドBが呼び出され、stopメソッドも呼び出されました。その後、スレッド A は例外なく停止メソッドを実行し続けました。

スレッドセーフなストップウォッチは 2 回停止できないため、これは私が望んでいるものではありません。それを取り除く方法を知りたいだけです。

4

1 に答える 1

-1

スレッドセーフにしたいのは...(a)複数のスレッドがストップウォッチを開始してラップを実行している可能性がある、または(b)1つのスレッドがストップウォッチを開始している間に別のスレッドが同じストップウォッチでラップを完了する可能性があるためですか?

于 2012-06-25T00:55:38.607 に答える