例如我们并发任务数是100
_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardOldestPolicy());
上面例子中使用了无界队列,将会把任务都执行完,但是任务调度花费的时间会长
_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(30), new ThreadPoolExecutor.DiscardOldestPolicy());
上面例子中使用了有界队列,任务只能执行80个,有20个被抛弃,任务调度时间很快
如果将最大线程数和队列最大有限容量的和设置为大于或等于100,任务可以执行完,任务调度时间
很快,任务调度时间有二个值影响:
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
corePoolSize起决定作用,maximumPoolSize其次
如果使用有界队列,DiscardOldestPolicy策略使用时候需要注意的是maximumPoolSize和队列容量之和要不小于最大并发数,否则当任务并发数达到最大时你的任务可能被丢弃
_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(30), new ThreadPoolExecutor.CallerRunsPolicy());
上面例子使用了CallerRunsPolicy策略,如果线程池内活动线程数达到maximumPoolSize,如果此时还有并发任务数还在迅速增大,线程池会使用调用者的线程执行任务,如果有执行时间很长的任务并发,要慎用该策略
_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardOldestPolicy());
上面例子中使用了无界队列,将会把任务都执行完,但是任务调度花费的时间会长
_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(30), new ThreadPoolExecutor.DiscardOldestPolicy());
上面例子中使用了有界队列,任务只能执行80个,有20个被抛弃,任务调度时间很快
如果将最大线程数和队列最大有限容量的和设置为大于或等于100,任务可以执行完,任务调度时间
很快,任务调度时间有二个值影响:
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
corePoolSize起决定作用,maximumPoolSize其次
如果使用有界队列,DiscardOldestPolicy策略使用时候需要注意的是maximumPoolSize和队列容量之和要不小于最大并发数,否则当任务并发数达到最大时你的任务可能被丢弃
_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(30), new ThreadPoolExecutor.CallerRunsPolicy());
上面例子使用了CallerRunsPolicy策略,如果线程池内活动线程数达到maximumPoolSize,如果此时还有并发任务数还在迅速增大,线程池会使用调用者的线程执行任务,如果有执行时间很长的任务并发,要慎用该策略