我读到了Java 7中引入的Fork/Join框架的实现,我只是想检查一下我是否理解了这个魔术是如何工作的。
据我所知,当一个线程派生时,它会在它的队列中创建子任务(其他线程可能窃取,也可能不窃取)。当线程尝试" join“时,它实际上检查现有任务的队列,然后递归地执行它们,这意味着对于任何-2\f25 'join‘操作,-2\f25 frames 2\f6将被添加到线程调用堆栈中(一个用于join,另一个用于新执行的任务调用)。
因为我知道JVM不支持尾部调用优化(在这种情况下可以用来删除连接方法堆栈框架),我认为在执行包含大量分叉和连接的复杂操作时,线程可能会抛出StackOverflowError
。
我是对的,还是他们找到了一些很酷的方法来阻止它?
编辑
这里有一个场景来帮助澄清这个问题:假设(为简单起见)我们在forkjoin池中只有一个线程。在某个时间点-线程分叉,然后调用join。而在join方法中,线程发现它可以执行forked任务(就像它在队列中发现的那样),所以它调用下一个任务。该任务依次派生,然后调用join -因此,在执行join方法时,线程将在其队列中找到派生的任务(就像前面一样)并调用它。在该阶段,调用堆栈将至少包含两个连接和两个任务的帧。
正如您所看到的,fork join框架转换为普通递归。因为java不支持尾部调用优化-如果java中的每一次递归都足够深入,就会导致StackOverflowError
。
我的问题是- fork/join框架的实现者是否找到了一些很酷的方法来防止这种情况。
https://stackoverflow.com/questions/11262474
复制相似问题