多线程
文章平均质量分 73
多线程
Sudo_Wang
这个作者很懒,什么都没留下…
展开
-
ForkJoinPool、CAS原子操作
ForkJoinPool是由JDK1.7后提供多线程并行执行任务的框架。可以理解为一种特殊的线程池。1.任务分割:Fork(分岔),先把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割。2.合并结果:join,分割后的子任务被多个线程执行后,再合并结果,得到最终的完整输出。类似于分治的思想,把大任务一点点拆分为一个个小任务。如果要统计1~100之间的和,当然可以直接暴力for循环,不过也可以把它拆分为10个任务,计算1到10的和,11到20的和…原创 2024-03-29 20:46:05 · 1138 阅读 · 0 评论 -
ThreadPoolExecutor经典面试题
每个work在runWork()的时候去getTask(),在getTask内部,并没有针对性的区分当前work是否是核心线程或者类似的标记。只要判断works数量超出core,就会调用poll(),否则take()答案:如果队列中没有任务时,核心线程会一直阻塞在获取任务的方法,直到返回任务。即便是第一个被创建的核心线程,仍然有可能被销毁。验证:起一个线程池,放置一个任务sleep,debug查看结束前后的状态。1)线程池是如何保证线程不被销毁的呢?2)那么线程池中的线程会处于什么状态?原创 2024-03-29 17:22:41 · 278 阅读 · 0 评论 -
线程池详解
设置为20,那么任何时候线程池至少会有10个活跃的线程(如果有任务需要执行),即使有些线程是闲置的。当任务数增加,并且所有的核心线程都在忙时,线程池可以临时创建更多的线程,最多到20个。线程上下文切换是有成本的,因为它需要CPU周期来保存和加载线程的状态信息,并且在切换过程中CPU不做任何实际的工作,只是在两个线程之间传递。举例来说,如果你想要添加一个新线程到线程池时,需要检查当前活动的线程数是否少于配置的最大线程数。节省cpu切换线程的时间成本(需要保持当前执行线程的现场,并恢复要执行线程的现场)。原创 2024-03-28 23:56:13 · 870 阅读 · 1 评论