ThreadPoolExecutor的构造函数比较复杂,最完备的构造有7个参数。
ThreadPoolExecutor( //(线程数量)线程池最小线程数。 int corePoolSize, //线程池创建的最大线程数。 int maximumPoolSize, //当线程池中空闲线程数量超过corePoolSize时,多余的线程会在多长时间内被销毁。 long keepAliveTime, //keepAliveTime的单位。 TimeUnit unit, /** * 任务队列, * 被添加到线程池中,但尚未被执行的任务; * 它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种; */ BlockingQueue<Runnable> workQueue, /** *线程工厂,用于创建线程,一般用默认即可。 */ ThreadFactory threadFactory, //自定义拒绝策略。当任务太多时如何拒绝任务。 RejectedExecutionHandler handler )
参数说明补充:
handler:通过这个参数你可以自定义任务的拒绝策略。如果线程池中所有的线程都在忙碌,并且工作队列也满了(前提是工作队列是有界队列),那么此时提交任务,线程池就会拒绝接收。至于拒绝的策略, 你可以通过handler这个参数来指定。ThreadPoolExecutor已经提供了以下4种策略。
详情: https://www.cnblogs.com/dafan...
ThreadPoolExecutor提供的3个submit()方法和1个FutureTask工具类来支持获得执行任务执行结果的需求:
// 提交Runnable任务 Future<?> submit(Runnable task); // 提交Callable任务 Future<T> submit(Callable<T> task); // 提交Runnable任务及结果引⽤ Future<T> submit(Runnable task, T result);
//创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 ExecutorService executor1 = Executors.newCachedThreadPool(); //创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 ExecutorService executor2 = Executors.newFixedThreadPool(10); //创建一个定长线程池,支持定时及周期性任务执行。 ExecutorService executor3 = Executors.newScheduledThreadPool (10); //创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。 ExecutorService executor4 = Executors.newSingleThreadExecutor ();
不建议使用Executors,Executors提供的很多方法默认使用都是无界的LinkedBlockingQueue, 高负载情境下,无界队列很容易导致OOM,而OOM会导致所有请求都无法处理,所以强力建议使用有界队列。
无界队列很容易导致OOM,而OOM会导致所有请求都无法处理,所以强力建议使用有界队列。
使用有界队列,当任务过多时,线程池会触发执行拒绝策略,线程默认的拒绝会。