Discuss / Java / 为什么漏写了 invokeAll(subtask1, subtask2); 会导致程序一直处于运行状态?

为什么漏写了 invokeAll(subtask1, subtask2); 会导致程序一直处于运行状态?

Topic source

因为看到了会并行执行,所以猜测是创建了多个线程执行子任务,尝试注释掉看看运行时长

// invokeAll会并行运行两个子任务
invokeAll(subtask1, subtask2);

结果程序一直处于运行状态,没有出现带有 result 的输出,我将创建的shu'zu

叮嘱111

#2 Created at ... [Delete] [Delete and Lock User]

可以看到这一句:

Long subresult1 = subtask1.join();

当前线程会等待 subtask1 线程结束,正常情况下,subtask1 线程会执行 invokeAll(subtask1, subtask2) 这段代码。它会继续向下切割,直到满足指定的条件。但是你这里将他注释掉了,subtask1 什么都不干,而你又等待它执行完成,造成垃圾回收器认为 subtask1 在运行中,所以不进行回收。这里造成死锁。所以导致一直是运行状态。

如有错误,欢迎指正。


  • 1

Reply