java------线程池
预先创建好一定数量线程对象,存入缓冲池,需要用的时候直接从缓冲池中取出,用完之后不要销毁,还回到缓冲池中,供下一次任务使用。
优点:
- 提高线程的利用率
- 提高响应速度
- 便于统一管理线程对象
- 可控制最大并发量
工作流程:
- 初始化线程池,创建默认数量的线程对象
- 当任务过多的时候,额外补充线程数量
- 当任务趋于正常,额外补充的线程会自动销毁
线程池实现的三种方式:
!!这三种都不常用,都有自身缺点!!
1、
Executors.newSingleThreadExecutor():单例线程池,只有一个线程在干活2、
Executors.newFixedThreadPool(5):指定数量的线程池3、
Executors.newCachedThreadPool():根据电脑自身配置创建线程池
java
public class ExecutorServiceTest {
public static void main(String[] args) {
// ExecutorService executorService = Executors.newSingleThreadExecutor();
// ExecutorService executorService = Executors.newFixedThreadPool(5);
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
final int temp = i;
executorService.execute(() -> {
System.out.println(Thread.currentThread().getName() + ":" + temp);
});
}
executorService.shutdown();
}
}
ThreadPoolExecutor :线程池原生类(一般用这种方式)
核心参数:
java
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
- corePoolSize:核心池大小
- maximumPoolSize:线程池最大线程数
- keepAliveTime:空闲线程存活时间
- unit:时间单位
- workQueue:阻塞队列
- threadFactory:线程工厂
- handler:拒绝策略
new ThreadPoolExecutor.DiscardPolicy():直接忽略,不会报错new ThreadPoolExecutor.AbortPolicy():拒绝,会报错出来
java
public class ExecutorServiceTest {
public static void main(String[] args) {
ExecutorService executorService = new ThreadPoolExecutor(2, 5,
1L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());
for (int i = 0; i < 9; i++) {
final int temp = i;
executorService.execute(() -> {
System.out.println(Thread.currentThread().getName() + "::" + temp);
});
}
executorService.shutdown();
}
}