Java线程池如何工作?

时间:2018-10-12 07:10:08

标签: java multithreading threadpool

我正在研究一个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条消息进行负载测试时,我可以在日志文件中看到消息“ EnteringallocateThread”和“ Entering HelperThread” 5000次,但是我的run方法仅执行1000次就意味着消息“ Entering run”在日志文件中仅存在1000次。由于这一原因,其他4000条消息无法处理。

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

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

非常感谢您的帮助。

关于, 克里山

0 个答案:

没有答案