首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CommonJ WorkManagerTaskExecutor Spring 3进行多线程处理

使用CommonJ WorkManagerTaskExecutor Spring 3进行多线程处理
EN

Stack Overflow用户
提问于 2012-05-12 00:15:39
回答 2查看 5.2K关注 0票数 3

大家好,我是这个论坛的新手,我刚刚问了一个关于使用Spring的问题。我一直在论坛上寻找更好的信息,但我没有看到任何关于这个主题的细节。这就是我的处境。

我的应用程序使用由ThreadPoolTaskExecutor处理的多个线程,一位朋友告诉我,他认为这不是正确的选择,因为我们使用的是websphere 7.0应用服务器。我的一切都正常工作,只要稍加调整,就可以用一个ThreadPoolTaskExecutor取代WorkManagerTaskExecutor。当我运行应用程序时,线程通过websphere服务器上的默认工作管理器触发。然而,似乎正在发生的问题是,即使我使用的是workManagerTaskExecutor.waitForAll(collection,超时);它从来没有真正等待线程完成。我知道线程正在运行,即线程正在执行它们各自的方法,因为如果在所有这些操作之后发出一个冗长的for循环,数据就在那里,就好像没有数据一样。我想知道以下两件事。

  1. WorkManagerTaskExecutor是要走的路吗?还是使用ThreadPoolTaskExecutor就足以处理企业web应用程序上的多个线程?
  2. 如果WorkManagerTaskExecutor是走的路呢?对于为什么waitForAll方法要完成,就好像方法已经完成一样,有什么想法吗?什么时候他们显然不是呢?在加载页面之后,我可以在日志中看到这些方法仍然在运行,并最终完成。

任何帮助都将不胜感激。如果我遗漏了什么,我会很乐意提供更多关于这个问题的信息,因为我真的很感激任何可能提供的帮助。

提前谢谢,

帐单

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-12 02:08:58

您应该通过扩展内置于java.util.concurrent.Executor中的JavaSE接口来实现并发类,然后使用弹簧IoC容器,您可以在Websphere下运行时注入WorkManagerTaskExecutor的实现类。

如果您想要在另一个Java应用服务器上运行,这将为您提供灵活性,甚至如果您直接在JVM上运行容器,这也是可行的,因为您可以插入一个ThreadPoolTaskExecutor,而不必更改任何代码。

您应该避免直接针对CommonJ Websphere API (JSR 237)进行编码,例如使用waitForAll方法,因为它只适用于IBM和Oracle。

票数 3
EN

Stack Overflow用户

发布于 2012-05-14 18:24:41

对我来说,这个问题的最终赢家是:

代码语言:javascript
复制
List<Callable<?>> callables = new ArrayList<Callable<?>>();
    List<Future<?>> futures = new ArrayList<Future<?>>();
    for (int i = 0; i<callers.length;i++){
        callables.add(new MainTaskExecutor(this,entity,callers[i]));

    }
    for (Callable c:callables){
        futures.add(workTaskExecutor.submit(c));
    }
    for (Future<?> f:futures){
        do{}while(!f.isDone());
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10560028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档