Запустите процесс выборки для определенного количества времени и возвращаемого значения в 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
который вы должны поймать в этом случае.