
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程池是程序员在学习计算机编程开发语言的时候需要重点掌握的一个编程知识点,下面我们就通过案例分析来了解一下,java编程线程池应用方法分享。
ThreadFactor参数为线程工厂。可以通过线程工厂为每个创建出来的线程设置更有意义的名字。
RejectedExecutionHandler参数为饱和策略。当队列和线程池都满了,我们需要使用饱和策略来处理新任务。一般有以下四种策略。
AbortPolicy:直接抛出异常。
CallerRunsPolicy:只用调用者所在线程来运行任务。
DiscardOldestPolicy:丢弃队列里近的一个任务,并执行当前任务。
DiscardPolicy:不处理,丢掉。
当然,也可以通过RejectedExecutionHandler接口自定义策略,比如记录日志或者持久化存储不能处理的任务。
为什么要求用ThreadPoolExecutor创建线程池
否则有资源耗尽的风险,Executors返回的线程池对象弊端如下:
FixedThreadPool和SingleThreadPool:允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量请求,导致OOM。
CachedThreadPool和ScheduledThreadPool:允许的创建线程数量为Integer.MAx_VALUE,可能会创建大量线程,导致OOM。
向线程池提交任务
可以用execute()和submit()两个方法向线程池提交任务,前者提交不需要返回值的任务,后者提交需要返回值的任务。
关闭线程池
使用shutdown()或shutdownNow()方法来关闭线程池。原理是遍历线程池中的工作线程,逐个调用interrupt()方法。
shutdownNow()会将线程池状态设置为STOP,并尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表。而shutdown()只是将线程池状态设置为SHUTDOWN状态,然后中断所有没有正在执行任务的线程。
通常调用shutdown()方法,如果任务不一定要执行完,就调用shutdownNow()。
合理配置线程池
我们需要通过任务的特性,来分析合理的线程池配置方式:
任务的性质:CPU密集型任务、IO密集型任务和混合型任务
CPU密集型任务配置尽可能少的线程,如配置CPU核数+1个线程。
IO密集型人物应配置尽可能多的线程,如配置2*cpu核数个线程。
混合型任务尽量拆分
任务优先级:高、中、低
优先级不同的任务可以使用优先级队列PriorityBlockingQueue来处理。
任务执行时间:长、中、短
执行时间不同的任务交给不同规模的线程池处理。
任务依赖性:是否以来其他系统资源,如数据库资源
依赖数据库连接池的任务,因为线程提交SQL后需要等待数据库返回结果,等待时间越长则CPU空闲时间越长,那么线程数应该设置得越大,才能更好地使用CPU。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。