读《Java并发编程的艺术》(四)

作者: 方腾飞 魏鹏 程晓明

第九章、Java中的线程池

1、线程池的好处
(1)降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗
(2)提高响应速度,当任务到达时,任务可以不需要等待线程创建就能立即执行
(3)提高线程的可管理性

2、提交新任务到线程池的流程
(1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务
(2)线程池判断工作队列是否已经满了,如果工作队列没有满,则将新提交的任务存储在这个工作队列里
(3)如果线程池判断线程池中线程是否到达最大线程数,如果满了则交给饱和策略

3、具体流程
(1)如果当前运行的线程少于corePoolSize,则创建新线程来执行任务(执行需要获取全局锁)
(2)如果运行的线程等于或者多于corePoolSize,则将任务加入BlockingQueue
(3)如果无法将任务加入BlockingQueue(队列已满),则创建新的线程来处理任务
(4)如果创建新线程将会使当前运行的线程超过maximumPoolSize,任务将会被拒绝,并调用RejectedExecutionHandler.rejectedExecution()方法

4、工作线程
线程池创建线程时,会将线程封装成工作线程Worker,Worker在执行完任务后,还会循环获取工作队列里的任务来执行

5、向线程池提交任务
(1)execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功
(2)submit()方法用于提交需要返回值的任务,线程池会返回一个future类型的对象,通过这个future对象可以判断任务是否执行成功,并且可以通过future的get方法获取返回值,get方法会阻塞当前线程直到任务完成

6、依赖数据库连接池的任务,因为线程提交SQL后需要等待数据库返回结果,等待时间越长,则CPU空闲时间越长,那么线程数应该设置得越大,这样才能更好地利用CPU

第十章、Executor框架

1、工作单元Runnable和Callable,执行机制Executor框架

2、框架组成
(1)任务:包括被执行任务需要实现的接口:Runnable接口和Callable接口
(2)任务的执行:包括任务执行机制的核心接口Executor,继承自Executor的ExecutorService接口。框架有两个关键类实现了ExecutorService接口(ThreadPoolExecutor和ScheduledThreadPoolExecutor)
(3)异步计算的结果:包括接口Future和实现了Future接口的FutureTask类

3、Executor是一个接口,将任务的提交与任务的执行分离开来

4、ThreadPoolExecutor是线程池的核心实现类,用来执行被提交的任务

5、ScheduledThreadPoolExecutor是一个实现类,可以在给定的延迟后运行命令,或者定期执行命令

第十一章、Java并发编程实践

1、生产者和消费者模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度

2、生产者和消费者模式是通过一个容器来解决生产者和消费者的强耦合问题,阻塞队列相当于一个缓冲区,平衡了生产者和消费者的处理能力,将生产者和消费者解耦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值