身为JAVA工作者必须了解的实战知识(七)
博客专区 > 叶荷 的博客 > 博客详情
身为JAVA工作者必须了解的实战知识(七)
叶荷 发表于3个月前
身为JAVA工作者必须了解的实战知识(七)
  • 发表于 3个月前
  • 阅读 1
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

一、在任务与执行策略之间的隐性解耦

有些类型的任务需要明确地指定执行策略,包括:

. 依赖性任务。依赖关系对执行策略造成约束,需要注意活跃性问题。要求线程池足够大,确保任务都能放入。

. 使用线程封闭机制的任务。需要串行执行。

. 对响应时间敏感的任务。

. 使用ThreadLocal的任务。

1. 线程饥饿死锁

线程池中如果所有正在执行任务的线程都由于等待其他仍处于工作队列中的任务而阻塞,这种现象称为线程饥饿死锁。

2. 运行时间较长的任务

Java提供了限时版本与无限时版本。例如Thread.join、BlockingQueue.put、CutDownLatch.await、Selector.select

二、设置线程池的大小

要正确地设置线程池的大小,你必须估算出任务的等待时间与计算时间的比值。这种估算不需要很精确,并且可以通过一些分析或监控工具来获得。

公式定义:

int N_CPUS = Runtime.getRuntime().availableProcessors();

CPU并不是唯一影响线程池大小的资源,还包括内存、文件句柄、套接字句柄和数据库连接等。计算每个任务对该资源的需求量,然后用该资源的可用总量除以每个任务的需求量,所得结果就是线程池大小的上限。

三、配置ThreadPoolExecutor

API文档中对构造函数的描述:

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

RejectedExecutionHandler handler)

用给定的初始参数和默认的线程工厂创建新的 ThreadPoolExecutor。

1. 线程池的创建与销毁

可以查看Executors几个方法源码来辅助理解ThreadPoolExecutor参数的配置。

2. 管理队列任务

ThreadPoolExecutor允许提供一个BlockingQueue来保存等待执行的任务。基本的任务排队方法有3种:无界队列、有界队列、同步移交。

java.util.concurrent.BlockingQueue 所有已知实现类:

ArrayBlockingQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, PriorityBlockingQueue, SynchronousQueue

3. 饱和策略

有界队列已经填满或者向关闭的Executor提交任务时需要考虑饱和策略。

ThreadPoolExecutor.setRejectedExecutionHandler

public void setRejectedExecutionHandler(RejectedExecutionHandler handler)设置用于未执行任务的新处理程序。

java.util.concurrent.RejectedExecutionHandler 所有已知实现类:

ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.CallerRunsPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.DiscardPolicy

AbortPolicy是默认饱和策略

-- 待填充

4. 工厂方法

5. 在调用构造函数后再定制ThreadPoolExecutor

在创建线程池后,依然可以通过ThreadPoolExecutor提供的方法修改构造时传入的参数。

四、扩展ThreadPoolExecutor

五、递归算法的并行化

暂时用不到

以上就是我推荐给Java开发者们的一面试经典知识。但是这些知识里面并没有太多Java全栈、Java晋阶、JAVA架构之类的题,不是我不推荐,而是希望大家更多的从基本功做起,打好基础,太多复杂的内容一会儿也说不明白。

好了同学们,我能介绍的也都全部介绍完给你们了,如果下获得更多JAVA教学资源,可以选择来我们这里共同交流,群:240448376,很多大神在这里切磋学习,不懂可以直接问,晚上还有大牛免费直播教学。

注:加群要求

1、具有一定工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加,有些应届生和实习生也可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

PS:现在主要讲解的内容是(反射原理枚举原理与应用注解原理常用设计模式、正规表达式高级应用、JAVA操作Office原理详解JAVA图像处理技术,等多个知识点的详解和实战)

6.小号或者小白之类加群一律不给过,谢谢。

最后,每一位读到这里的网友,感谢你们能耐心地看完。觉得对你有帮助可以给个喜欢!希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步

共有 人打赏支持
粉丝 0
博文 24
码字总数 41519
×
叶荷
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: