gpt4 book ai didi

java - 被其他线程引用的已卸载 OSGi 包中的对象会发生什么情况?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:41:01 25 4
gpt4 key购买 nike

假设我有一个 Bundle A,它有一个组件 B,它不是 Export-Package 的一部分。该组件将安排自己在激活后定期运行。调度程序由另一个包提供。

我的问题是,如果我卸载 Bundle A,而组件 B 正由调度程序线程池中的线程运行,这意味着什么?线程会继续运行吗?还是线程会抛出异常?

最佳答案

bundle 有一个生命周期。当 bundle 处于 Activity 状态时,它将在卸载之前停止。如果“组件 B”是一个声明式服务组件,它也会被停止。如果没有,那么至少会触发捆绑激活器中的停止方法。

在停止期间,您(作为组件 B 的提供者)负责从调度中取消调度组件,以便将其从线程池中删除。如果线程当前正在运行,那么您应该实现取消功能,以便它可以中止。

如果您没有正确清理(即取消调度/取消线程),那么线程可能会再次执行。如果您从该线程内访问 OSGi API,那么您将获得 IllegaleStateException(对于某些 API 用法,因为 bundle 的 BundleContext 在停止后变得无效)。但是,如果不是,那么您的线程可能会永远运行下去。对象和内存不会被释放。类和捆绑类加载器不会被垃圾回收。因此,正确实现“停止”很重要。

关于java - 被其他线程引用的已卸载 OSGi 包中的对象会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com