线程状态
- 新建状态(new);
- 就绪状态(Runnable)或可运行状态--调用 start()方法后;
- 运行状态(Running)--就绪状态的线程获取了CPU,执行程序代码; Thread.yield 让出 CPU,可让线程由运行状态变为可运行状态。
- 阻塞状态(Blocked)--线程因为某种原因放弃 CPU 使用权,暂时停止运行;sleep,join;
- 死亡状态(Dead)--线程执行完或因异常退出 run()方法。
- 等待状态(WATING)
线程池优点
- 1.通过重用现有的线程而不是创建线程,可以在处理多个请求时分摊在线程创建和销毁过程中产生的巨大开销。
- 2.请求到达时,工作现场已经存在,不会由于等待线程而延迟,提高了响应性;
- 3.通过适当性的线程池大小,可以是CPU保持忙碌状态,防止应用程序耗尽内存。
线程池运行图
默认线程池
FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L,TimeUnit.MILLISECONDS,
newLinkedBlockingQueue<Runnable>(,
threadFactory));
}
CachedThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
newSynchronousQueue<Runnable>());
}
ScheduledThreadPool
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
线程池四种拒绝策略
AbortPolicy(默认)
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
DiscardPolicy
ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。如果线程队列已满,则后续提交的任务都会被丢弃,且是静默丢弃。
DiscardOldestPolicy
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务。
CallerRunsPolicy
这个策略重试添加当前的任务,他会自动重复调用 execute() 方法,直到成功。
线程池关闭
ExecutorService提供了shutdown和shutdownNow方法来关闭线程池;
- shutdown
- (1)线程池的状态变成SHUTDOWN状态,此时不能再往线程池中添加新的任务,否则会抛出RejectedExecutionException 异常。
- (2)线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成, 才会退出。
- shutdownNow
- (1)线程池的状态立刻变成STOP状态,此时不能再往线程池中添加新的任务。
- (2)终止等待执行的线程,并返回它们的列表;
- (3)试图停止所有正在执行的线程,试图终止的方法是调用 Thread.interrupt()。ShutdownNow()要等待所有正在执行的任务都执行完成了才能退出。