线程池:
-
如果有非常多的任务需要非常多的线程来完成,每个线程的工作时间不长,就需要创建很多线程,工作完又立即销毁 [线程频繁创建和销毁线程]
-
频繁创建和销毁线程非常消费性能,那么线程池,就是可以创建一些线程,放在"池子"中,用的时候去池子取一个线程去使用,使用完再放回去,线程可以重用
-
线程池,底层其实就是集合队列,里面存储线程对象,用的时候去抽即可,就不要频繁创建线程了
使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资
源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题 --> 摘自阿里官方手册
1,ThreadPoolExecutor
参数名 | 解释 | 备注 |
---|---|---|
int corePoolSize | 指定线程池的线程数量(核心线程数) | 不能小于0 |
int maximumPoolSize | 指定线程池可支持的最大线程数 | 最大数量>=核心线程数 |
long keepAliveTime | 指定临时线程的最大存活时间 | 不能小于0 |
TimeUnit unit | 指定存活时间的单位(秒,分,时,天) | 时间单位 |
BlockingQueue workQueue | 指定任务队列 | |
ThreadFactory threadFactory | 指定哪个线程工厂创建线程 | |
RejectedExecutionHandler handler | 指定线程忙,任务队列满的时候新任务来了怎么办?拒绝策略 |
问: 什么是创建临时线程?
答: 新任务提交时发现核心线程都在忙,任务队列也满了,并且还可以创建临时线程,此时才会创建线程
问:什么时候开始拒绝任务?
答:核心线程和临时线程都在忙,任务队列也满了,新的任务过来就会拒绝
LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(10);
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, 15, 10, TimeUnit.SECONDS, queue);
for (int i = 0; i < 50; i++) {
poolExecutor.submit(new Runnable( ) {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"干活" );
}
});
}