Рекомендованный способ создания потоков в среде Java EE - это API-интерфейс Concurrency Utils, который является частью спецификации EE7.
С помощью этого API будет создан новый поток, который будет управлятьсяконтейнер, гарантирующий, что все службы EE доступны для вашего потока (например, безопасность, транзакции).
Примеры ниже взяты с моего собственного сайта здесь и здесь
Использование ManagedExecutorService
Чтобы создать новый поток с помощью ManagedExecutorService, сначала создайте объект задачи, который реализует Callable.В методе call () мы определим работу, которую мы хотим выполнить в отдельном потоке.
public class ReportTask implements Callable<Report> {
Logger logger = Logger.getLogger(getClass().getSimpleName());
public Report call() {
try {
Thread.sleep(3000);
catch (InterruptedException e) {
logger.log(Level.SEVERE, "Thread interrupted", e);
}
return new Report();
}
}
Затем нам нужно вызвать задачу, передав ее в метод submit () ManagedExecutorService..
@Stateless
public class ReportBean {
@Resource
private ManagedExecutorService executorService;
public void runReports() {
ReportTask reportTask = new ReportTask();
Future<Report> future = executorService.submit(reportTask);
}
}
Использование ManagedThreadFactory
Сначала создайте задачу Runnable, которая определит, какую работу следует выполнять в фоновом режиме.
public class ReportTask implements Runnable {
Logger logger = Logger.getLogger(getClass().getSimpleName());
public void run() {
try {
//do your background task
Thread.sleep(10000);
} catch (InterruptedException e) {
logger.log(Level.SEVERE, "Thread interrupted", e);
}
}
}
Чтобы получить поток, управляемый контейнером, мы просто запрашиваем у ManagedThreadFactory новый поток и передаем ему наш экземпляр Runnable.Для запуска потока мы вызываем start ().
@Stateless
public class ReportBean {
@Resource
private ManagedThreadFactory threadFactory;
public void runReports() {
ReportTask reportTask = new ReportTask();
Thread thread = threadFactory.newThread(reportTask);
thread.start();
}
}