大家好,我是这个论坛的新手,我刚刚问了一个关于使用Spring的问题。我一直在论坛上寻找更好的信息,但我没有看到任何关于这个主题的细节。这就是我的处境。
我的应用程序使用由ThreadPoolTaskExecutor处理的多个线程,一位朋友告诉我,他认为这不是正确的选择,因为我们使用的是websphere 7.0应用服务器。我的一切都正常工作,只要稍加调整,就可以用一个ThreadPoolTaskExecutor取代WorkManagerTaskExecutor。当我运行应用程序时,线程通过websphere服务器上的默认工作管理器触发。然而,似乎正在发生的问题是,即使我使用的是workManagerTaskExecutor.waitForAll(collection,超时);它从来没有真正等待线程完成。我知道线程正在运行,即线程正在执行它们各自的方法,因为如果在所有这些操作之后发出一个冗长的for循环,数据就在那里,就好像没有数据一样。我想知道以下两件事。
任何帮助都将不胜感激。如果我遗漏了什么,我会很乐意提供更多关于这个问题的信息,因为我真的很感激任何可能提供的帮助。
提前谢谢,
帐单
发布于 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。
发布于 2012-05-14 18:24:41
对我来说,这个问题的最终赢家是:
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());
}https://stackoverflow.com/questions/10560028
复制相似问题