О, пожалуйста, не создавайте неуправляемые потоки самостоятельно в приложении Java EE. Используйте Executor
с фиксированным пулом потоков. Используйте Callable
в качестве задач и используйте Future
в качестве будущих результатов.
Создайте его при запуске приложения (например, в ServletContextListener
или в сервлете init()
).
ExecutorService executor = Executors.newFixedThreadPool(10); // Pool of 10 threads.
По первому запросу отправьте ему задание и получите результат Future
. В приведенном ниже примере предполагается, что он имеет тип String
и что Task
представляет собой Callable<String>
:
Future<String> result = executor.submit(new Task());
Сохраните это в сеансе:
request.getSession().setAttribute("result", result);
По любому последующему запросу в том же сеансе вы можете получить его из сеанса и проверить, выполнен ли он или нет, и при необходимости отменить его.
Future<String> result = (Future<String>) request.getSession().getAttribute("result");
if (result != null) {
if (!result.isDone() && userWantsToCancel) {
result.cancel();
}
}
Смотри также: