我希望线程池里面的线程能够在4 - 16之间浮动,队列容量为256。我写了下面这样的代码:
ThreadPoolExecutor tExecutor = new ThreadPoolExecutor(16, 16, 60L, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(256));
tExecutor.allowCoreThreadTimeOut(true);
其他条件都符合要求,但是这里只能在0 - 16之间浮动。
如果这样写:
ThreadPoolExecutor tExecutor = new ThreadPoolExecutor(4, 16, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());
tExecutor.allowCoreThreadTimeOut(false);
可以在4 - 16之间浮动,但是队列不能存储数据。
我该怎样设定参数,达到目的呢?
这样写不行吗?
ThreadPoolExecutor tExecutor = new ThreadPoolExecutor(4, 16, 60L, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(256));
tExecutor.allowCoreThreadTimeOut(false);
coreThreadTimeOut一定要是false的,你第一种是true肯定不行,空闲的core thread会被干掉
1.队列不能存储数据时因为SynchronousQueue
的问题,它是一种阻塞队列,其中每个插入操作必须等待另一个线程的对应移除操作 ,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有
,所以它存储不了数据;
2.线程池的处理是这样的:
来了一个新任务后,先检查当前线程池的线程数有没有达到
corePoolSize
,如果没有,则new一个线程出来处理新任务;如果当前线程数已经达到了
corePoolSize
,则将新任务放到队列中;如果队列已经满了,则开始new新线程去处理,直到达到
maximumPoolSize
。