1.使用线程池的目的:
线程是稀缺资源,不能频繁的创建。
解耦作用;线程的创建与执行完全分开,方便维护。
应当将其放入一个池子中,可以给其他任务进行复用
2.线程池原理:
核心的思想就是把宝贵的资源放到一个池子中;每次使用都从里面获取,用完之后又放回池子供其他人使用。
3.配置线程池:
常见的线程:
Executors.newCachedThreadPool():无限线程池。
Executors.newFixedThreadPool(nThreads):创建固定大小的线程池。
Executors.newSingleThreadExecutor():创建单个线程的线程池
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
这几个核心参数的作用:
corePoolSize 为线程池的基本大小。
maximumPoolSize 为线程池最大线程大小。
keepAliveTime 和 unit 则是线程空闲后的存活时间。
workQueue 用于存放任务的阻塞队列。
handler 当队列和最大线程池都满了之后的饱和策略
关闭线程池:
有运行任务自然也有关闭任务,从上文提到的 5 个状态就能看出如何来关闭线程池。
方法: shutdown()和shutdownNow()。
但他们有着重要的区别:
shutdown() 执行后停止接受新任务,会把队列的任务执行完毕。
shutdownNow() 也是停止接受新任务,但会中断所有的任务,将线程池状态变为 stop。
原文地址:https://www.cnblogs.com/wnlsq/p/12163712.html