ScheduledExecutorService的Threadpoolsize

时间:2012-02-07 07:06:58

标签: java multithreading

我有一个ScheduledExecutorService,可以获取定期执行的任务:

scheduler = Executors.newScheduledThreadPool( what size? );

public addTask(ScheduledFuture<?> myTask, delay, interval) {
    myTask = scheduler.scheduleAtFixedRate(new Runnable() {
          // doing work here
     },
          delay,
          interval,
          TimeUnit.MILLISECONDS );
}

调度程序获取的任务数量完全取决于我的程序用户。通常,创建ThreadPoolSize #number_of_Cpu_Threads应该是一个好主意,这样每个CPU或CPU线程一次执行一个任务,因此这应该提供最快的吞吐量。但是,如果任务涉及I / O(如我们的程序中那样),我该怎么办?我的程序中的任务是从Internet上的服务器获取数据并将其保存在数据库中。所以这意味着他们大部分时间都在等待数据进入(也就是空闲)。那么这个问题的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:1)

这实际上取决于具体情况:

  • 将添加多少个任务? (您已经说过这取决于用户,但您是否有任何想法?在您需要创建池之前,您是否知道这一点?)
  • 他们每个人需要多长时间?
  • 他们会做任何密集型工作吗?
  • 如果他们都保存到同一个数据库,那么是否存在并发问题? (也许您希望从不同的服务器获取多个线程并将项目放入队列中,但实际上只有一个线程在数据库中存储数据?)
  • 只要你没有“落后”,无论如何表现有多重要?

最终,我强烈怀疑你自己需要对此进行基准测试 - 如果没有更多信息,就不可能提供一般指导,即使使用特定的数字,也可能是猜测工作。硬数据更有用:)

请注意,newScheduledThreadPool的参数仅指定在线程空闲时要保留在线程池中的核心线程的数量 - 因此它将自己进行一定程度的平衡