线程池的好处:使用线程池的好处是减少系统在创建线程和销毁线程时所使用的时间与开销,解决资源不足的问题,如果不使用线
程池,有可能导致系统创建大量的线程而导致内存消耗或者“过度切换”的问题。
线程池创建方法:
Executors.newCachedThreadPool()
:无限线程池。Executors.newFixedThreadPool(nThreads)
:创建固定大小的线程池。Executors.newSingleThreadExecutor()
:创建单个线程的线程池。
三种不同的创建方法都会调用线程池创建函数:
- ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)
参数作用:
- corePoolSize:线程池核心数量
- maximumPoolSize:线程池最大线程数量
- keepAliveTime:空闲线程存活时间
- unit:keepAlivetime的时间单位
- workQueue:存放任务的阻塞队列
- handler:线程池和队列都满了之后的拒绝策略
线程池状态:
- RUNNING:正常运行状态,可以接受队列中的新任务
- SHUTDOWN:调用了shutdown()方法,不会接受新任务,但是队列中的任务需要执行完毕
- STOP:调用了shutdownnow()方法,抛弃队列中的任务,不再接受新任务,终止正在执行的任务
- TERNIMATE:终止状态,执行了函数ternimate()后会进入这个状态
- TIDYING:所有任务都执行完毕,调用了shutdown()和shutdownnow()函数后,都会尝试更新为这个状态
但是不建议使用Executor方式创建线程池,阿里开发手册指出:
OOM(Out Of Memory)
应直接使用ThreadPoolExecutor()方法创建线程池,并指定队列长度workQueue,避免OOM。