线程池

线程池

1 . 线程池的优点:
I . 降低资源消耗:通过重复利用已创建的线程降低线程的创建与销毁带来的损耗

II . 提高响应速度:当任务到达时,无须等待线程创建就可以立即执行

III. 提高线程的可管理性:使用线程池可以统一进行线程分配、调度与监控

2 . 线程池的继承关系

Executor–execute(Runnable command)-----> 被ExecutorService(普通调度池核心接口)所继承–submit(Runnable | Callable):返回Future; 它又被ScheduledExecutorService(定时调度池核心接口)所继承;

–schedule(Runnable | Callable command , long delay, TimeUnit unit)延迟delay个时间单位后开始执行 继承以上;
–schedleAtFixedRate(Runnable command , long initialDelay , long period, TimeUnit unit);
延迟initialDelay个时间单位后开始执行,并且每隔period个时间单位就执行一次。
–ThreadPoolExecutor(普通调度池核心类) – 实现ExecutorService接口
–ScheduledThreadPoolExector(定时调度池核心类) – 实现ScheduledExecutorService接口

Executors (线程池工具类)-内置的四大线程
3 . 线程池的执行流程******
第一步:判断核心线程池是否已满,如果未满,创建一个新的线程来执行任务,如果已满,判断是否有空闲线程,有的话将任务分配给空闲线程,否则,执行步骤2.(创建线程需要获得全局锁)

第二步:将判断工作队列(阻塞队列BlockingQueue)是否已满。如果工作队列未满,将任务存储在工作队列中等待空闲线程调度,如果工作队列已满,执行步骤3.

第三布:判断当前线程池线程数量是否已达到最大值,如果没有达到最大值,则创建新的线程来执行任务,(创建线程需要获得全局锁)否则,执行步骤4。

第四步:调用饱和策略来处理任务。

3 . 线程池的使用

4 . 1 手工创建线程池*
–通过new一个ThreadPoolExecutor就可以实现自定义线程池。
参数:
—1)coolPoolSize(核心线程池大小)
当提交一个任务到线程池时,只要核心线程池未达到corePoolSize,创建新线程来执行任务。调用perStartAllCoreTreads(),线程池会提前创建并启动所有核心线程。

**—2)BlockingQueueworkQueue(任务队列):**保存等待执行任务的阻塞队列。

-ArrayBlockingQueue:基于数组有界阻塞队列,按照FIFO原则对元素进行排序。

-LinkedBlockingQueue:基于链表的(无界)阻塞队列,按照FIFO排列元素,吞吐量要高于ArrayBlockingQueue。内置线程池newFixedThreadPool-固定大小线程池就采用此队列。

-SynchronousQueue:一个不存储元素的阻塞队列(无界队列)。每个插入操作需要等待另一个线程的移除操作,否则插入操作一直处于阻塞状态。吞吐量通常高于LinkedBlockingqueue。内置线程池newCachedThreadPool-缓存线程池就采用此队列。

-PriorityBlockingQueue:具有优先阻塞队列。

—3)maximumPoolSize(线程池最大数量

—4)keepAliveTime(线程保持活动时间)
线程池的工作线程空闲后,保持存活时间。
任务比较多,并且每个任务执行的时间比较短,可以调大此参数来提高线程利用率。

—5)RejectedExecutionHandler(饱和策略)
-AbortPolicy:无法处理新任务抛出异常(JDK默认采用此策略)
-CallerRunsPolicy:使用调用者所在线程来处理任务
-DisCardOldestPolicy:丢弃队列中最近的一个任务并执行当前任务
-DisCardPolicy:不处理任务,丢弃任务,也不报异常。

调用Future接口的get方法会阻塞其他线程,直到取得当前线程执行完毕后的返回值。
FutureTask中的任务只会被执行一次。

关闭线程池:shutdown()

5 . 内置四大线程池

5 . 1固定大小线程池FixedThreadPool
return new ThreadPoolExecutor(nThreads,
nThreads,
0L,
TimeUnit.MILLISEONDS,
new LinkedBlockingQueue());
固定大小消线程池适用于为了满足资源管理需求,而需要限制当前线程数量的应用。适用于负载较重的服务器。

5 . 2 单线程池SingleThreadExecutor
return new ThreadPoolExecutor(1,
1,
0L,
TimeUnit.MILLISEONDS,
new LinkedBlockingQueue());
适应于需要保证顺序执行各个任务;并且在任意时间不会有多个线程。

5 . 3 缓冲线程池CachedThreadPool
根据需要创建新线程。
return new ThreadPoolExecutor(0,
Interger . MAX_VALUE,
60L,
TimeUnit.SEONDS,
new SynchronousQueue());
当提交任务速度快于执行任务速度,缓存线程池会不断创建新线程。
–大小无界线程池,适用于 执行很多的短期异步小程序,或者负载较轻的服务器。

5 . 4 定时调度池 ScheduledThreadPool(nThread)
需要定时执行任务的应用场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值