库调多了,都忘了最基础的概念-《线程池篇》
【摘要】 库调多了,都忘了最基础的概念-《线程池篇》
🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM算法
💒 公众号:知识浅谈
🔥 联系方式vx:zsqtcc
XXXX总结
🤞这次都给他拿下🤞
正菜来了⛳⛳⛳
线程池用于管理线程的创建与销毁。
- 相比于单线程的频繁创建与销毁消耗的资源,由线程池来管理创建与销毁节省了频繁创建与销毁的时间。
- 其次便于对所有的线程进行管理。
- 线程的重复使用,提高了利用率
- 节省了创建线程的时间,需要线程的时候可以快速使用。
池化技术:就是提前准备好一些资源,在需要的时候就可以直接使用这些资源,并且能重复使用。如数据库连接池,线程池这些。
自动创建提供的有四种:
- newFixedThreadPool:创建固定数量的线程池。核心线程数=最大线程数=固定的
- newCachedThreadPool:能持续创建线程,因为最大的线程数量设置的为Integer.MAX_VALUE
- newSingleThreadExecutor:只能创建单个线程的线程池,核心线程数=最大线程数=1
- newScheduledThreadPool:创建一个可以执行延迟任务的线程池。
手动创建ThreadPoolExecutor 手动设置参数,一般都推荐根据业务自己设置不同的参数。
kernel-size:核心线程数也就是线程池中一直存活的线程数
maximumPoolSize :最大线程数,线程池中最多创建的线程数
keepAliveTime:指的是除了核心线程外的空闲线程存活时间。
TimeUnit:存活时间的时间单位。
BlockingQueue:线程池的任务队列。
ThreadFactory:创建线程的工厂。
RejectedExecutionHandler:拒绝策略。
守护线程是对一个线程进行监视的线程。
守护线程是为用户线程服务的,当被守护线程死亡的时候,守护线程也就死亡了。
需要注意的一点:守护线程的设置 setDaemon(true)也就是设置自己的线程为守护线程之后再启动 start()。
之所以使用手动指定 ThreadPoolExecutor的参数创建线程池,因为这种方式可以通过参数来控制最大任务数和拒绝策略,不仅能根据业务灵活变化,还能让线程池的执行更加透明和可控,降低资源消耗。
- Running:运行状态:线程池运行的时候
- shutdown:关闭状态:不再接受其他的任务,把当前正在执行的任务和队列中的任务执行完。
- stop:停滞状态:不再接受其他的任务,并且抛弃当前正在执行的任务和队列中的任务。
- tiding:整理状态,所有的任务执行完之后,调用terminated()方法
- terminated:销毁状态,当执行完线程池的 terminated() 方法之后就会变为此状态。
正如上边说到的使用ScheduledThreadPool 执行定时任务。
具体的方法有如下三种:
- 只执行一次定时任务,使用 schedule 方法执行定时任务
- 执行多次定时任务,使用 scheduleAtFixedRate 方法执行定时任务
- 执行多次定时任务,使用 scheduleWithFixedDelay 方法执行定时任务
- 使用 isTerminated 方法判断。
- 使用 getCompletedTaskCount 方法判断。
- 使用 CountDownLatch 判断。这个在开始设置个数,每个线程执行完,调用countDown()
- 使用 CyclicBarrier 判断。
以上就是关于线程池使用的总结,希望有所帮助。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)