首页 > 解决方案 > Java 线程池是如何工作的?

问题描述

我正在开发一个 IoT 项目,其中设备将数据发送到我们的 Java 应用程序,称为网关适配器 (GA)。在java中,我使用线程池为我们从设备收到的每条消息启动一个新线程。

我有以下线程分配器和可运行线程的代码。

public class ThreadAllocator {

  /** The thread pool. */
  private ExecutorService executorService = Executors.newWorkStealingPool(1000);

  public void allocateThread(IoSession session, String message) {
    LOGGER.info("Entering allocateThread");
    executorService.execute(new HelperThread(null,session, message));       
  }
}
public class HelperThread implements Runnable {

  private String message;

  public HelperThread(String message) {
    LOGGER.info("Entering HelperThread");
    this.message = message;
  }

  public void run() {
    LOGGER.info("Entering run");
    // Process Message
  }
}

使用上面的代码,当我通过发送大约 5000 条消息进行负载测试时,我可以在日志文件中看到消息“Entering allocateThread”和“Entering HelperThread”5000 次,但我的 run 方法只执行了 1000 次,这意味着消息“Entering run”在那里日志文件只有 1000 次。因此无法处理其他 4000 条消息。

它是预期的行为“newWorkStealingPool”线程池吗?它只会执行等于其构造函数中提供的数字的任务吗?例如 Executors.newWorkStealingPool( 1000 );

请提出解决方案?我是否缺少一些配置,或者它不是我的场景的正确线程池?那么在这种情况下哪个线程池会正常工作呢?

非常感谢您的帮助。

问候, 克里山

标签: javamultithreadingthreadpool

解决方案


推荐阅读