スレッドセーフなストップウォッチを作成する方法を知りたいです。以下は単純なストップウォッチの実装で、ストップウォッチの基本的な操作を提供しますが、スレッドセーフではありません。
今考えられるのは、各メソッド (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 回停止できないため、これは私が望んでいるものではありません。それを取り除く方法を知りたいだけです。