Запустите процесс выборки для определенного количества времени и возвращаемого значения в Java

У меня есть метод Java, который делает выборку. То есть он делает что-то вроде этого:

TIME = 60 /* seconds */

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

return count;

Теперь, обычно, createRandomSample() и satiesSomeConditions(sample) работают довольно быстро (как за секунду или меньше), так что этот код работает хорошо.

Однако время от времени выполнение одной из этих функций может занять много времени. Как я могу контролировать этот процесс выборки, чтобы он работал не намного дольше, чем запрошено TIME. Я не против, если он будет работать, скажем, на 10% дольше, чем TIME, но я не хочу, чтобы он работал сколь угодно долго в течение TIME.

ExecutorService кажется слишком резким.

Это больше похоже на то, что мы хотим запустить выборку в отдельном потоке, а затем мягко сказать этому потоку прекратить выборку и дать любые результаты, которые у него есть в данный момент.

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() метод завершается, когда вызывается. Если это происходит до истечения времени ожидания, все в порядке. Если нет, он бросает TimeoutException который вы должны поймать в этом случае.

Другие вопросы по тегам