【问题标题】:wait for child threads to finish, without having a reference to the thread等待子线程完成,没有对线程的引用
【发布时间】:2014-10-26 06:15:31
【问题描述】:

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

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

//my code
}

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

【问题讨论】:

  • 看来你没有任何真正的选择来完成这项工作=\
  • 你知道要预先生成多少线程吗?
  • 是的。 loadMenu 方法将启动一个线程或不启动线程。
  • 有没有机会SSG 有可以拦截的方法?反射性地访问私有成员怎么样?

标签: java multithreading concurrency semaphore monitors


【解决方案1】:

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

有可能(理论上)遍历 JVM 中所有现有的 Thread 对象,并尝试(按名称)识别可能与任务相关联的线程。但是我不知道在没有帮助的情况下,您如何可靠地区分线程,而无需了解它们是什么。如果你能得到这样的帮助,那就是向子引用请求迈出的一小步。

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


1 - 有一个(无用的)例外。您总是可以通过调用Thread.currentThread() 找到“此线程”。但是,保证当前线程仍然活着。如果您(错误地)尝试将 Thread 发送到 join() 本身,就会发生不好的事情;例如线程将死锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2017-07-19
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多