Java EE 规范和多线程
2022-09-01 11:19:50
我正在使用Struts和Spring编写Java EE应用程序。在其中一个操作中,存在繁重的数据库处理,因此存在性能问题。我想知道的是,我可以在这里使用多线程吗?我认为Java EE规范不允许在Server创建的线程之外创建自定义线程(我使用Weblogic)。请指导我完成这项工作。
我正在使用Struts和Spring编写Java EE应用程序。在其中一个操作中,存在繁重的数据库处理,因此存在性能问题。我想知道的是,我可以在这里使用多线程吗?我认为Java EE规范不允许在Server创建的线程之外创建自定义线程(我使用Weblogic)。请指导我完成这项工作。
在 Java EE 环境中创建线程的推荐方法是使用并发 Utils API,它是 EE7 规范的一部分。
通过使用此API,您的新线程将被创建并由容器管理,保证所有EE服务都可用于您的线程(例如安全性,事务)。
使用托管执行器服务
若要使用 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();
}
}
然后,我们需要通过将任务传递到 ManagedExecutorService 的 submit() 方法来调用该任务。
@Stateless
public class ReportBean {
@Resource
private ManagedExecutorService executorService;
public void runReports() {
ReportTask reportTask = new ReportTask();
Future<Report> future = executorService.submit(reportTask);
}
}
使用托管线程工厂
首先创建一个 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();
}
}
这个问题偶尔会弹出。
根据规范,它未获得授权。最好的页面是这个页面:Q/A:J2EE限制
也就是说,有一些方法可以生成线程,特别是在具有.WorkManager
请参阅以下问题:
事实上,第一个目标是 EJB,而最后一个是关于访问文件系统的,这是关于一般限制的。
希望它有帮助。