点击上方 Java后端,选择 设为星标
优质文章,及时送达
如何指定多个线程的执行顺序
-
设定一个 orderNum,每个线程执行结束之后,更新 orderNum,指明下一个要执行的线程。并且唤醒所有的等待线程。 -
在每一个线程的开始,要 while 判断 orderNum 是否等于自己的要求值,不是,则 wait,是则执行本线程。
-
减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。 -
可以根据系统的承受能力,调整线程池中工作线程的数目,放置因为消耗过多的内存,而把服务器累趴下。
核心线程池ThreadPoolExecutor内部参数
-
corePoolSize:指定了线程池中的线程数量 -
maximumPoolSize:指定了线程池中的最大线程数量 -
keepAliveTime:线程池维护线程所允许的空闲时间 -
unit: keepAliveTime 的单位。 -
workQueue:任务队列,被提交但尚未被执行的任务。 -
threadFactory:线程工厂,用于创建线程,一般用默认的即可。 -
handler:拒绝策略。当任务太多来不及处理,如何拒绝任务。
线程池都有哪几种工作队列
-
ArrayBlockingQueue:底层是数组,有界队列,如果我们要使用生产者-消费者模式,这是非常好的选择。 -
LinkedBlockingQueue:底层是链表,可以当做无界和有界队列来使用,所以大家不要以为它就是无界队列。 -
SynchronousQueue:本身不带有空间来存储任何元素,使用上可以选择公平模式和非公平模式。 -
PriorityBlockingQueue:无界队列,基于数组,数据结构为二叉堆,数组第一个也是树的根节点总是最小值。
-
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 -
ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。 -
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新提交被拒绝的任务 -
ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务
线程池的线程数量怎么确定
-
一般来说,如果是CPU密集型应用,则线程池大小设置为N+1。 -
一般来说,如果是IO密集型应用,则线程池大小设置为2N+1。 -
在IO优化中,线程等待时间所占比例越高,需要越多线程,线程CPU时间所占比例越高,需要越少线程。这样的估算公式可能更适合:最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目
如何实现一个带优先级的线程池
- END -
最近整理一份面试资料《Java技术栈学习手册》,覆盖了Java技术、面试题精选、Spring全家桶、Nginx、SSM、微服务、数据库、数据结构、架构等等。 获取方式:点“ 在看,关注公众号 Java后端 并回复 777 领取,更多内容陆续奉上。 推荐阅读 1. 每日一题之 ZooKeeper 2. 每日一题之 Redis 3. 每日一题之 MySQL 4. 每日一题之 JVM-01 5. 每日一题之 JVM-02 6. 每日一题之 JVM-03 7. 每日一题之 HashMap
喜欢文章,点个在看
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论