【问题标题】:Multithreading in webspherewebsphere中的多线程
【发布时间】:2017-06-21 12:53:56
【问题描述】:

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

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 个线程)?

【问题讨论】:

  • 你的问题对我来说没有意义。你能再澄清一点吗?
  • 如果您觉得我的回答有帮助 - 您可以考虑接受吗?
  • 不相关:这样的“空”循环:while (!executor.isTerminated()) { }危险的。你在这里做“热”的等待;这意味着 CPU 将 100% 旋转等待条件变为真 - 它会在几秒钟内对该方法进行数十亿次调用。你真的很想在循环体中加入一些“sleep(xxx)”调用!
  • 这更像是Websphere创建的60个线程和代码内部使用的5个线程之间存在什么样的关系。
  • 我认为:没有关系。只是不同的线程对象,由不同的池管理。

标签: java multithreading threadpool executorservice pool


【解决方案1】:

这两件事没有任何关系。

server 设置是关于服务器使用的线程的。见documentation

使用此页面配置应用程序服务器使用的一组线程。请求通过任何 HTTP 传输发送到服务器。线程池使服务器的组件能够重用线程以消除在运行时创建新线程的需要。创建新线程会耗费时间和资源。

现在,您的应用程序代码创建了自己的独立线程池。

这与该系统池无关

当然,您的应用程序可能会将“任务”发送到该系统线程池;以这种方式使用它。

【讨论】:

  • 感谢您的回答。
【解决方案2】:

不,那些将是不同的线程池。

有60个线程的需要通过jndi服务按名称获取。 Websphere 线程池有点不同。例如,它支持 JTA(分布式)事务。您只能在那些特殊的线程池中使用 JTA 事务。

本地的将有 5 个线程,并且不受 Websphere 的任何影响。您可以通过提交大量任务然后通过 jstackkill -3 命令打印线程堆栈来检查线程数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2017-06-10
    • 1970-01-01
    • 2016-07-17
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多