Websphere中的多线程技术

3

我有一个多线程应用程序,因此我使用池大小为5个线程实现了ExecutorService

public class SimpleThreadPool {    
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
          Runnable worker = new WorkerThread("" + i);
          executor.execute(worker);
        }
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("Finished all threads");
    }
}

应用程序将部署在Websphere Web服务器上,设置包含线程池配置:应用程序服务器 > 线程池 > 默认值,最大大小设置为60。
我的问题是,哪个池大小配置会被采用,Websphere中的配置是否会覆盖代码中的配置(5个线程)?

1
与此无关的,像这样的“空”循环:while (!executor.isTerminated()) { }危险的。在这里你正在进行“热”等待;这意味着CPU将会旋转100%等待条件变为真——它将在几秒钟内调用该方法数十亿次。你真的想在循环体中加入一些“sleep(xxx)”调用! - GhostCat
@GhostCat 关于之前的问题,你有没有想法关于 WebSphere 创建的 60 个线程和代码内部使用的 5 个线程之间存在什么样的关系?是这样的吗:每个 WebSphere 线程处理一个请求将会启动 5 个内部绿色线程? - Bill
也许我把那个注释放错了位置 :-) - GhostCat
1
我认为:它们之间没有关系。只是由不同池管理的不同线程对象。 - GhostCat
@GhostCat 两种对象类型之间没有关系,但是当服务器完全充电时,我可以看到210个线程计数。不过,我使用的APM(Dynatrace)混合了这两种类型! - Bill
显示剩余4条评论
2个回答

2
不,它们将是不同的线程池。
需要通过JNDI服务按名称获取具有60个线程的线程池。WebSphere线程池有点不同。例如,它支持JTA(分布式)事务。您只能在这些特殊的线程池中使用JTA事务。
本地线程池将有5个线程,并且不会受到WebSphere的任何影响。您可以通过提交大量任务,然后通过或命令打印线程堆栈来检查线程数。

2
那两件事情互不相关。服务器设置与服务器使用的线程有关。请参阅文档
使用此页面配置应用程序服务器使用的一组线程。请求通过任何HTTP传输发送到服务器。线程池使服务器的组件能够重用线程,以消除在运行时创建新线程的需要。创建新线程会耗费时间和资源。
现在,您的应用程序代码创建了自己独立的线程池。
这与系统池没有任何关系。
当然,您的应用程序可能会将“任务”发送到该系统线程池中,并以这种方式利用它。

谢谢你的回答。 - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接