【问题标题】:Threads and termination of main主线程和终止
【发布时间】: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


【解决方案1】:

这不是答案。我无法回答,因为你没有显示足够的代码让任何人都能够知道你的程序中到底发生了什么,但我有一个建议给你。

程序中的一半线程除了创建其他线程然后等待之外什么都不做。创建线程是昂贵的。为什么不让这些线程工作呢?而不是创建一个新线程来完成child2 的工作,而调用线程除了等待什么都不做,而是让调用线程完成工作。例如,像这样:

   Thread child1 = new Thread(new Task(...));
// Thread child2 = new Thread(new Task(...));   // Don't do this.
   Task    task2 = new Task(...);               // Do this instead.

   child1.start();
// child2.start();    // And, Don't do this.
   task2.run();       // Do this instead.

   try {
       child1.join();
   } catch (...) {
       ...
   }

您的程序应该产生相同的结果,只使用一半的线程。


附:为了获得额外的荣誉,请考虑是否可以使您的程序与 thread pool 一起使用,而不是使用裸 Threads。

https://www.baeldung.com/thread-pool-java-and-guava

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多