【发布时间】:2022-01-26 18:09:26
【问题描述】:
我有一个关于线程的小问题。
(该代码仅用于说明我的问题,没有实际意义)
public int recursiveMethod(int val, int depth){
if ( depth < 0}{
return sequentialMethod(val)
}
Integer [] buffer = new Integer [2];
Thread child1 = new Thread(new Task(val,buffer, 0, depth -1))
Thread child2 = new Thread(new Task(val,buffer, 1, depth -1))
try{
child1.join();
child2.join(); }
catch(InterruptException e){
..}
return buffer[0] + buffer[1]
}
public class Task implements Runnable {
public Task(val, buffer, index, depth){
constructor...
}
public void run{
buffer[index] = recursiveMethod(val, depth)
return; }
这只是一个小代码示例(没有意义,但有插图),我想用它来说明我一直在做的事情。 (实际上并不那么重要,它只是将计算拆分为子部分,将这些结果存储在缓冲区中)
因此,在根线程的代码中,我递归调用 recursiveMethod(),这会再次创建其他线程,这些线程再次调用相同的方法...所有父线程都加入了它们的子线程。
对于我的实际代码有点重(方阵的并行矩阵乘法),我很快就得到了正确的结果,但我遇到了一个我认为很奇怪的问题:
即使我将所有父线程加入到它们的子线程中,我的 IDE 中的程序仍然会在最终结果之后运行几秒钟(0.5s - 1.5s)(因此调用具有原始深度的递归方法)被退回。所以有些东西还在运行。
我只是不明白,因为据我了解,join 方法只是负责首先所有线程必须死掉,直到可以返回最终结果。
如果有什么不清楚的地方,我很乐意回答和澄清
很高兴得到答案
提前致谢 乔纳斯
【问题讨论】:
-
Re,“如果有不清楚的地方......”您还没有展示对
recursiveMethod()进行“root”调用的代码,并且您还没有展示它之后的作用“ root”调用返回。另外,您说您在 IDE 中运行它,但您没有说 哪个 IDE,或者您使用什么命令来运行程序。另外,您的程序是否有可能调用任何可以创建事件分派线程或计时器线程的 GUI 框架例程?
标签: java multithreading recursion