Java EE规范和多线程

Sid*_*Sid 28 java multithreading java-ee

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

Chr*_*hie 62

在Java EE环境中创建线程的推荐方法是使用Concurrency Utils 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@Stateless
public class ReportBean {

    @Resource
    private ManagedExecutorService executorService;

    public void runReports() {
        ReportTask reportTask = new ReportTask();
        Future<Report> future = executorService.submit(reportTask);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要获取容器管理线程,我们只需向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();
    }
}
Run Code Online (Sandbox Code Playgroud)


ewe*_*nli 9

这个问题偶尔出现一次.

根据规范,它没有被授权.要查看的最佳页面是:Q/A:J2EE限制

也就是说,有一些方法可以产生线程,特别是在Weblogic中WorkManager.

看到这些问题:

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

希望能帮助到你.


Jör*_*ann 5

这些限制主要是因为 Java EE 和 EJB 想要支持透明集群。例如,集群的一台服务器不应修改文件,因为这些更改无法轻松镜像到其他服务器。对于线程,存在每个集群或每个服务器是否应该有一个线程的问题。这些线程也不容易被应用服务器监控。

也就是说,应该可以像在普通应用程序中一样在 Java EE 服务器中创建线程、套接字连接或访问文件系统。