java - 等待子线程完成,而不引用该线程

标签 java multithreading concurrency semaphore monitors

我正在为一个已经存在的应用程序构建一个 API,该应用程序有时使用线程。所以我的方法之一是这样的

private SSG theSSG;
...
private void doSomething(){
  theSSG.loadMenu();

//my code
}

现在,loadMenu 方法可以生成一个线程,但不一定。如果是这样,doSomething 将执行其余代码,而新线程正在执行其他代码。我需要的是一种方法来等待 loadMenu() 完成执行其所有子线程,然后再继续执行下一行代码。我没有可能运行的线程的引用,因为那是基于用户的选择,所以我不能使用join()。我也无法编辑应用程序(或者 loadMenu 中发生的情况)。

最佳答案

除非您拥有对 Thread 对象的引用1,否则无法判断线程是否已完成。

(理论上)可以搜索 JVM 中所有现有的 Thread 对象,并尝试识别可能与任务关联的线程(按名称)。但我不知道如何在没有理解线程的帮助的情况下可靠地区分线程。如果您可以获得此类帮助,那么询问 child 的推荐信只是一小步。

您最好的选择是重新设计应用程序的这一部分。要么改变一些东西,以便框架知道(或可以找出)子线程是什么,要么让它可以将“等待线程完成”功能委托(delegate)给可以实现它的东西。

<小时/>

1 - 对此有一个(无用的)异常(exception)。您始终可以通过调用 Thread.currentThread() 来找到“此线程”。但是,当前线程保证仍然存活。如果你(错误地)尝试让一个线程加入join()本身,就会发生不好的事情;例如线程将死锁。

关于java - 等待子线程完成,而不引用该线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26570338/

相关文章:

c# - Json.Net 中的 "Current error context error is different to requested error"异常

c# - Mutex - TryOpenExisting 与新的

java - java中如何使用monitor实现排除

java - Hashmap - 单键,多值 - 如何检索?

java - 如何从 Java 发送一个 4 字节的 header 并在 Python 中读取它?

java - 使用java从html文件中提取文本

java - 有什么方法可以使用 javax.net.ssl.SSLServerSocket 指定 Diffie-Hellman 素数的范围吗?

c# - 我被 async/await 宠坏了!现在正在为明确的任务延续而苦苦挣扎

java - ConcurrentHashMap中,如何同步更新?

concurrency - 使用并发的 Golang 流水线