Есть ли у этого кода какой-либо серьезный дефект в использовании потока?Моя цель состоит в том, чтобы добавить монитор времени, чтобы контролировать максимальное время, которое разрешено возвращать ответ.Максимальное время устанавливается с помощью WATCH_DOG_TIME_LIMIT.Если время обработки превышает его, оно истечет время ожидания и вернет ответ по умолчанию.
public SimilarityResponse getSimilarity(InputInfo questionInput) {
Preconditions.checkNotNull(questionInput);
Callable<SimilarityResponse> queryTask = () -> similarityService.computeSimilarity(questionInput);
Future<SimilarityResponse> futureTask = executorService.submit(queryTask);
try {
SimilarityResponse response = futureTask.get(WATCH_DOG_TIME_LIMIT, TimeUnit.MILLISECONDS);
LOGGER.info("AfterExtraction(): {}", questionInput);
return response;
} catch (InterruptedException ie) {
ie.printStackTrace();
} catch (ExecutionException ee) {
ee.printStackTrace();
} catch (TimeoutException te) {
futureTask.cancel(true);
LOGGER.warn("QE L0 tiring: {} {}", WATCH_DOG_TIME_LIMIT, questionInput);
}
// Only when timeout occurs, execute this.
SimilarityResponse sr = new SimilarityResponse();
sr.setSku(questionInput.getSku());
sr.setText(questionInput.getQuestion());
return sr;
}
И 2-й вопрос, если нет проблемы с корректностью, есть ли проблема эффективности?Эта функция должна быть вызвана снова и снова.Каждый вызов создает новый экземпляр Callable.Это хорошо?