如何正确配置ThreadPoolTask​​Executor池属性?

时间:2016-05-31 08:22:14

标签: java spring multithreading executorservice

我配置了ThreadPoolTaskExecutor,但结果与我预期的不同。它的以下行为是否正确?怎么可以解释呢?

@Bean
public TaskExecutor taskExecutor() {
    int core = 1;
    int max = 1;
    int queue = 2;

    ThreadPoolTaskExecutor bean = new ThreadPoolTaskExecutor();
    bean.setCorePoolSize(core);
    bean.setMaxPoolSize(max);
    bean.setQueueCapacity(queue);
    bean.setKeepAliveSeconds(60);
    return bean;
}


@Scheduled(initialDelay = 5000, fixedDelay = 10000)
public void init() {
    int nthreads = 1;
    for (int i = 0; i < nthreads; i++)
        async.run(i);
}


@Service
public class MyAsync {
    @Async("taskExecutor")
    public void run(int i) {
        Sysout("running: " + i);
    }
}

谁可以为不同的池配置解释以下结果:

  • core = 1,max = 1,queue = 2:抛出RejectedExecutionException(为什么,因为我刚刚创建了1个线程?)
  • core = 1,max = 2,queue = 2:抛出RejectedExecutionException(再次:为什么?应该允许两个线程,我刚刚开始nthreads=1。)
  • core = 1,max = 2,queue = 5:没有任何反应。没有打印出sysout(为什么?)
  • core = 1,max = 2,queue = 5,nthreads = 3:没有任何反应
  • core = 1,max = 2,queue = 5,nthreads = 4:现在执行此命令,但开始抛出RejectedExecutionException
  • core = 2,max = 2,queue = 5,nthreads = 4:再次,没有任何反应

我没有得到异步执行程序的这种行为。

我的目标如下:创建一个运行1-2个线程的Executor(取决于负载)。任务应排队最多5个线程。如果任何线程在队列中超过60秒,它们应该超时并在未执行时被删除。

0 个答案:

没有答案