《Java并发编程的艺术》读书笔记 第九章 Java中的线程池

《Java并发编程的艺术》读书笔记 第九章 Java中的线程池


1.线程池的实现原理

​ ​ ​ ​ ​ ​ ​ ​ ​ 当提交一个新任务到线程池,线程池的处理流程如下:

  • 线程池判断核心线程里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务,如果核心线程里的线程都在执行任务,则进入下个流程。
  • 线程池判断工作队列是否已经满了,如果工作队列没有满,则将新提交的任务存储在这个工作队列里,如果工作队列满了,则进入下个流程。
  • 线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务,如果已经满了,则交给饱和策略来处理这个任务。
2.线程池的使用
2.1 线程池的创建

​ ​ ​ ​ ​ ​ ​ ​ ​ 可以通过TreadPoolExecutor来创建一个线程池。

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

​ ​ ​ ​ ​ ​ ​ ​ ​ 参数说明如下:

1.corePoolSize:线程池的基本大小。当提交一个任务到线程池的时候,线程池会创建一个线程来执行任务,即使其它空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有基本线程。

2.runnableTaskQueue:任务队列。用于保存等待执行的任务的阻塞队列。可以选择以下几个阻塞队列。

  • ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序。
  • LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。
  • SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
  • PriorityBlockingQueue:具有优先级的无限阻塞队列。

3.ThreadFactory:用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字。

4.maximumPoolSize:线程池最大数量。线程池允许创建的最大线程数。如果队列满了,并且已创建的线程数小于最大线程数,则线程池会再创建新的线程执行任务。

5.RejectedExecutionHandler:饱和策略。当队列和线程池都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。JDK1.5Java线程池框架提供了以下4种策略

AbortPolicy:直接抛出异常

CallerRunsPolicy:只用调用者所在线程来运行任务

DiscardOldesPolicy:丢弃队列里最近的一个任务,并执行当前任务

DiscardPolicy:不处理,丢弃掉。

6.keepAliveTime:线程活动保持时间。线程池的工作线程空闲后,保持存活的时间。所以,如果任务很多,并且每个任务执行的时间比较短,可以调大时间,提高线程的利用率。

7.TimeUnit:线程活动保持时间的单位。

2.2 向线程池提交任务

​ ​ ​ ​ ​ ​ ​ ​ ​ 方法有2种,execute()和submit()方法。

​ ​ ​ ​ ​ ​ ​ ​ ​ execute() 方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功。

​ ​ ​ ​ ​ ​ ​ ​ ​ submit() 用于提交需要返回值的任务。线程池会返回一个 future类型的对象,通过这个future对象判断任务是否成功,并且可以通过future的get()方法来获取返回值,get()方法会阻塞当前线程直到任务完成,而使用get(long timeout ,TimeUnit unit)方法会阻塞当前线程一段时间后立即返回,这时候有可能任务没执行完。

2.3 关闭线程池

​ ​ ​ ​ ​ ​ ​ ​ ​ 可以调用线程池的shutdown或者shutdownNow方法关闭线程池。

​ ​ ​ ​ ​ ​ ​ ​ ​ 原理是:遍历线程池中的工作线程,然后逐个调用线程的interrupt方法中断线程,所以无法响应中断的任务可能永远无法停止。

​ ​ ​ ​ ​ ​ ​ ​ ​ 只要调用了这两个方法的任意一个,isShutDown方法会返回true。所有任务都关闭,才表示线程池关闭成功。这时候,调用isTerminaed方法会返回true。

shutdown:将线程池的状态设置为SHUTDOWN状态,然后中断所有没有正在执行任务的线程。

shutdownNow:将线程池的状态设置为STOP,然后尝试停止所有的正在执行或者暂停任务的线程,并返回等待执行任务的列表。

小结:通常调用shutdown方法关闭线程池,如果任务不一定要执行完可以调用shutdownNow方法。

2.4 合理地配置线程池

​ ​ ​ ​ ​ ​ ​ ​ ​ 合理分配线程池需要从下面几个角度分析:

  • 任务的性质:CPU密集型任务、IO密集型任务和混合型任务
  • 任务的优先级:高中低
  • 任务的执行时间:长、中、短
  • 任务的依赖性:是否依赖其它系统资源,如数据库连接、

​ ​ ​ ​ ​ ​ ​ ​ ​ CPU密集型任务应配置尽可能小的线程,IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程。

​ ​ ​ ​ ​ ​ ​ ​ ​ 优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理,可以让优先级高的任务先执行。

​ ​ ​ ​ ​ ​ ​ ​ ​ 执行时间不同的任务可以交给不同规模的线程池处理,或者使用优先级队列,让执行时间短的任务先执行。

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

2.5 线程池的监控

​ ​ ​ ​ ​ ​ ​ ​ ​ 当系统中大量使用线程池,就需要对线程池监控。监控线程池可以使用一些参数也可以通过继承线程池自定义线程池,重写线程池的beforeExecute、afterExcute、terminated方法,也可以在执行任务前后和线程池关闭前执行一些代码来进行监控。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值