3

サンプリングを行う Java メソッドがあります。つまり、次のようなことを行います。

TIME = 60 /* seconds */

startTime = now();
count = 0;
while (now() - startTime < TIME) {
    sample = createRandomSample();
    if (satisfiesSomeConditions(sample)) {
       count++;
    }
}

return count;

現在、通常、createRandomSample() と satisfiesSomeConditions(sample) は非常に高速 (1 秒以下) に実行されるため、このコードはうまく機能します。

ただし、これらの関数のいずれかの実行に時間がかかる場合があります。このサンプリング プロセスを制御して、TIME で要求された時間よりも長く実行しないようにするにはどうすればよいですか。たとえば、TIME よりも 10% 長く実行されてもかまいませんが、TIME よりも任意に長い時間実行したくありません。

ExecutorService は厳しすぎるようです。

別のスレッドでサンプリングを実行し、そのスレッドにサンプリングを停止して現在の結果を返すように穏やかに指示したいようなものです。

4

1 に答える 1

1

を使用できますFutureTask。このようなもの:

FutureTask<Void> futureTask = new FutureTask<Void>(new Callable<Void>() {
    @Override
    public Void call() throws Exception {
        doStuff();
        return null;
    }
    });
futureTask.run();
futureTask.get(60, TimeUnit.SECONDS); //handle exceptions

get()callable が完了すると、メソッドは終了します。タイムアウトの前にそれが発生した場合、すべて問題ありません。TimeoutExceptionそうでない場合は、この場合キャッチする必要がある をスローします。

于 2012-09-25T19:46:24.683 に答える