Java EE规范和多线程

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我正在使用Struts和Spring编写Java EE应用程序。在其中一项操作中,数据库处理繁重,因此存在性能问题。我想知道的是我可以在这里使用多线程吗?我认为Java EE规范不允许创建自定义线程,而不是由服务器创建的自定义线程(我使用Weblogic)。请通过这个指导我。

提问于
用户回答回答于

这个问题偶尔会出现。

根据规范,它没有被授权。要看的最好的页面是这样的:Q/A: J2EE Restrictions

也就是说,有很多方法可以产生线程,尤其是在Weblogic中WorkManager

看到这些问题:

  • 一个EJB如何并行化一个长时间的CPU密集型进程?
  • 为什么在J2EE容器中产生线程不鼓励?
  • J2EE程序员不写入文件

第一个针对EJB的事实并不重要,最后一个关于访问文件系统的事实是关于一般的限制。

用户回答回答于

在Java EE环境中创建线程的推荐方法是使用并发实用程序API,它是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();
    }
}

然后我们需要通过将它传递给ManagedExecutorService的submit()方法来调用该任务。

@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();
    }
}

扫码关注云+社区