线程池

Posted hetaoyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池相关的知识,希望对你有一定的参考价值。

线程池:                      数据源DataSource Druid
为何采用线程池?
-方便管理、监控线程状态
-提高任务响应速度
-线程可以重复利用



//1.加载驱动
//2.获取连接
//3.Statement
-select executeQuery():ResultSet
-update inserte delete executeUpdate():int
//3.ResultSet

//4.关闭资源

ExecutorService:普通调度池核心接口
-submit(Runnable || Callable) : Future<V>
-execute(Runnable) : void

ScheduledExecutorService:定时调度池(执行定时任务)

ThreadPoolExecutor:线程池核心实现类
Executors:线程池工具类

线程池工作流程:当任务到达线程池时工作顺序
-核心线程池corePoolSize
-阻塞队列BlockingQueue
-最大线程池maxiumPoolSize
-拒绝策略rejectHandler

1.若核心池未满,则创建新的线程执行任务而后将此线程入核心池
-若核心池满且有空闲线程,调度空闲线程执行任务。
2.将任务置入阻塞队列,排队等待空闲线程调度(juc)
-ArrayBlockingQueue:基于数组的有界阻塞队列
-LinkedBlockingQueue:基于链表的无界阻塞队列
-SynchrousQueue:不存储元素的无界阻塞队列

3.当阻塞队列满时,若此时最大线程池未满,创建新线程执行任务而后置入最大线程池中
4.若最大线程池已满,调用相应拒绝策略处理任务(默认为抛出异常且不处理任务)

手工创建线程池 new ThreadPoolExecutor()
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)


Thread 类执行Callable FutureTask

FutureTask类保证多线程场景下任务只会被执行一次

Future get()会阻塞当前线程直到取得Callable的返回值


jdk内置四大线程池

固定大小线程池:LinkedBlockingQueue
应用场景:开启一个线程是有开销的,每一个用户都是一个servlet,每个servlet都是一个线程,
当服务器负载较重的时候,限制线程的数量,可以采用固定大小线程池

单线程池 ,当任务到达的时候,都进入LinkedBlockingQueue
应用场景:某些需要同步处理的场合(任务需要按序处理)
缓存线程池 应用场景

以上是关于线程池的主要内容,如果未能解决你的问题,请参考以下文章

什么叫线程池?线程池如何使用?

多线程(六):线程池

多线程(六):线程池

十五、线程池(六)自动创建线程池的弊端

java 如何获得线程池中正在执行的线程数?

线程池参数与线程池调优