摘要:思想把大任务分割成多个小任务,再把小任务的结果汇总,最终得到大任务的结果。当一个线程执行完当前队列的任务时,他就会去窃取其他队列的任务来执行。当双端队列只有一个任务时,线程之间会竞争。
思想
把大任务分割成多个小任务,再把小任务的结果汇总,最终得到大任务的结果。
步骤如下:任务分割
结果汇总
示例图 工作窃取指的是线程从其他线程窃取任务来执行。当一个大任务分割成多个小任务的时候,为了减少线程之间的竞争,把小任务放在不同的队列里,每个队列都分配一个线程来执行任务。当一个线程执行完当前队列的任务时,他就会去窃取其他队列的任务来执行。由于都是同一个队列执行小任务,为了减少线程之间的竞争,窃取任务的时候,从队列的尾部拿任务。
优点:充分利用了线程的计算,减少线程之间的竞争
缺点:
消耗系统资源,比如创建线程和多个双端队列。
当双端队列只有一个任务时,线程之间会竞争。
示例图 类 ForkJoinTask实现了Future的接口,主要的子类有RecursiveAction和RecursiveTask。
RecursiveAction:没有返回值
RecursiveTask:有返回值
主要的方法:
fork():再创建一个子任务
invoke():执行任务
join():返回计算后的结果
ForkJoinPool通过调用invoke来执行ForkJoinTask的任务。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75262.html
摘要:示例计算一组数据,设置阈值为,也就是说每次计算的数量不超过个。总数总数运行结果如下可以看出,两次结果是一样的。创建继承的类,实现方法,这里主要是计算以及拆分任务合并结果。 示例 计算一组数据,设置阈值为50,也就是说每次计算的数量不超过50个。 public class RecursiveTaskDemo extends RecursiveTask { private stat...
摘要:线程和进程参考进程和线程的区别和联系线程线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。进程进程作为分配资源的基本单位。 线程和进程 参考进程和线程的区别和联系 线程:线程作为独立运行和独立调度的基本单位。由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销...
摘要:线程安全问题在并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。那么,该怎么解决呢,很简单,在方法前加个同步锁。运行结果如下有两种情况,是因为看谁先抢占锁,但是输出的算法结果是正确的。 线程安全问题 在java并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。 public class NotSafeDemo { ...
摘要:大多数待遇丰厚的开发职位都要求开发者精通多线程技术并且有丰富的程序开发调试优化经验,所以线程相关的问题在面试中经常会被提到。掌握了这些技巧,你就可以轻松应对多线程和并发面试了。进入等待通行准许时,所提供的对象。 最近看到网上流传着,各种面试经验及面试题,往往都是一大堆技术题目贴上去,而没有答案。 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就...
阅读 2624·2021-11-23 09:51
阅读 1612·2021-11-22 13:54
阅读 2686·2021-11-18 10:02
阅读 907·2021-08-16 10:57
阅读 3502·2021-08-03 14:03
阅读 1794·2019-08-30 15:54
阅读 3487·2019-08-23 14:39
阅读 563·2019-08-23 14:26