2 ghyghost ghyghost 于 2015.07.03 12:00 提问

forkjointask类的invokeAll(t1,t2)方法请教

各位前辈,
看了网址:
http://www.molotang.com/articles/706.html
但有一些问题需要请教一下:
public class MyRecursiveTask extends RecursiveTask {
@Override
protected String compute() {
this.invokeAll(t1, t2)
return null;
}
}
当我使用具有返回值RecursiveTask的类时,方法invokeAll(t1, t2)并没有处理返回值,是否代表invokeAll(t1,t2)方法只适用于RecursiveAction无返回值的情况?(问题1)
如果只适用于RecursiveAction无返回值的情况那我的清楚了,
如果不是只适用于RecursiveAction无返回值的情况,还适用于RecursiveTask的情况时,那invokeAll(t1,t2)如何处理返回值呢?(问题2)
难道要这样写吗?(问题3)伪代码如下:
public class MyRecursiveTask extends RecursiveTask {
@Override
protected String compute() {
MyRecursiveTask t1Left = new MyRecursiveTask();
MyRecursiveTask t2Right = new MyRecursiveTask();
this.invokeAll(t1Left, t2Right);
String returnString = t1Left.join() + " " + t2Right.join();
return returnString;
}
}

如果像上面这样写的话,您说这种情况影响效率,那这样写可以吗?(问题4)如下面
public class MyRecursiveTask extends RecursiveTask {
@Override
protected String compute() {
MyRecursiveTask t1Left = new MyRecursiveTask();
MyRecursiveTask t2Right = new MyRecursiveTask();
this.invokeAll(t1Left, t2Right);
//right移到前面
String returnString = t2Right.join() + " " + t1Left.join();
return returnString;
}
}

那如果这样写的话,如果是t2Right影响效率怎么办呢,有这种可能,或情况出现吗?(问题5)如果t2Right影响了效率,那什么样的写法是完全不影响效率的呢?(问题6)
如果文章用代码再案例化t1Left.join() + " " + t2Right.join();一下影响效率的时间比较差别就更好了,可惜没有看到啊,请教大家了!

1个回答

devmiao
devmiao   Ds   Rxr 2015.07.18 15:07

递归调用肯定是有性能的开销的,最好不要递归。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
fork/join模式中fork和invokeAll的区别
有一类问题,他们的本质上是将一个问题划分成多个子问题,然后再逐个的去解决子问题。在很多情况下,他们这些子问题是互不相干的。也就是说,我们针对他们每个执行的子问题,可以让他们采用独立的线程来运行。这样的话我们可以充分的发挥现在并行处理器的优势。      在fork/join模式中,我们在子任务中常常使用fork方法来让子任务采取异步方法执行,但是这不是高效的实现方法,尤其是对于forkjoinP
Fork/Join中的调用原理
错误程序 public class Calculator extends RecursiveTask { private static final int THRESHOLD = 100; private int start; private int end; public Calculator(int start, int end) {
ForkJoin框架的一些原理知识点
参考: Java 并发编程笔记:如何使用 ForkJoinPool 以及原理 作者 Doug Lea 的论文——《A Java Fork/Join Framework》 ForkJoinPool的commonPool相关参数配置
关于看完ForkJoinPool和ForkJoinTask文章后一些总结
关于ForkJoinTask:1,可以使用invokeAll(task)方法,主动执行其它的ForkJoinTask,并等待Task完成。(是同步的)2,还可以使用fork方法,让一个task执行(这个方法是异步的)3,还可以使用join方法,让一个task执行(这个方法是同步的,它和fork不同点是同步或者异步的区别)4,可以使用join来取得ForkJoinTask的返回值。由于Recursiv
[JAVA学习笔记-53]ForkJoin_invoke_submit_execute
在ForkJoinPool中,有invoke,submit,execute三个接口可以提交任务运行,这三个接口有什么区别?分别适用什么场景? 综述: 当前线程是FJ工作线程且属于当前FJPool,execute,submit方法会调用forkOrSubmit将task加入到工作线程的任务队列,而invoke直接调用FJTask的exec()方法; 当前线程非FJ工作线程或者不属于当前FJ
C# Tuple<T1,T2....T>元组的使用
1) 先说组元:一个数据结构,由通过逗号分割的,用于传递给一个程序或者操作系统的一系列值的组合。 NET Framework 直接支持一至七元素的元组 TupleT1> TupleT1, T2> TupleT1, T2, T3> TupleT1, T2, T3, T4> TupleT1, T2, T3, T4, T5> TupleT1, T2, T3, T4, T5, T6> T
Kotlin全局函数的引入和范围
(1)在Dog.kt文件中定义了函数ifNotNull,函数位于com.robot.kotlin.animal包下: package com.robot.kotlin.animal fun ifNotNull(value1: T1?, value2: T2?, bothNotNull: (T1, T2) -> (Unit)) { if (value1 != null && value
有三个线程T1,T2,T3,下面方法可以确保它们按顺序执行的有()该线程继续执行
1.先启动最后一个(T3调用T2,T2调用T1) package com.te; public class Testt { static Testt t=new Testt(); class T1 extends Thread{ @Override public void run() { //T3线程中要处理的东西 System.out.println("
SIP协议中的T1和T2
本文转载自:http://net.chinaunix.net/8/2008/10/21/1294575.shtml SIP协议中的T1和T2 因为SIP定义了自己的可靠性机制,所以可以使用不可靠的传输层协议,比方说UDP,来进行连接。 使用UDP来传输SIP时,消息的丢失和接受消息的顺序错乱都是有可能的。因为UDP只能保证传输的内容是无错的,但是不能保证传输的内容一定会到达目的地
“活锁”与“死锁”
一、活锁 如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求,...,T2有可能永远等待,这就是活锁的情形,如图8.4(a)所示。 避免活锁的简单方法是采用先来先服务的策略。 二、死锁 如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2