803.ThreadPool(线程池)⽤法与优势?
- ThreadPool 优点
- 减少了创建和销毁线程的次数,每个⼯作线程都可以被重复利⽤,可执⾏多个任务
- 可以根据系统的承受能⼒,调整线程池中⼯作线线程的数⽬,防⽌因为因为消耗过多的内存,⽽把服务器累趴下(每个线程需要⼤约1MB内存,线程开的越多,消耗的内存也就越⼤,最后死机)
- 减少在创建和销毁线程上所花的时间以及系统资源的开销
- 如不使⽤线程池,有可能造成系统创建⼤量线程⽽导致消耗完系统内存
- ⽐较重要的⼏个类:
类 | 描述 |
---|---|
ExecutorService | 真正的线程池接⼝。 |
ScheduledExecutorService | 能和Timer/TimerTask类似,解决那些需要任务重复执⾏的问题。 |
ThreadPoolExecutor | ExecutorService的默认实现。 |
ScheduledThreadPoolExecutor | 继承ThreadPoolExecutor的ScheduledExecutorService接⼝实现,周期性任务调度的类实现。 |
Java⾥⾯线程池的顶级接⼜是Executor,但是严格意义上讲Executor并不是⼀个线程池,⽽只是⼀个执⾏线程的⼯具。真正的线程池接⼜是ExecutorService。
- 任务执⾏顺序:
- 当线程数⼩于corePoolSize时,创建线程执⾏任务。
- 当线程数⼤于等于corePoolSize并且workQueue没有满时,放⼊workQueue中
- 线程数⼤于等于corePoolSize并且当workQueue满时,新任务新建线程运⾏,线程总数要⼩于maximumPoolSize
- 当线程总数等于maximumPoolSize并且workQueue满了的时候执⾏handler的rejectedExecution。也就是拒绝策略。