java - OSGi 线程永远不会停止运行,为线程定义了固定的生命周期

标签 java multithreading osgi threadpool runnable

我有一个 5 个线程池,我将其保存在数组中:

private static final Collection<Thread> workerThreads = new ArrayList<Thread>();

但是当我重新上传 osgi 插件时,线程继续运行,但数组将为空,因此它将填充新的 5 个线程。所以最终我有大量的线程在运行。

我的线程池被设计为永远运行,它们只是保持空闲状态并等待作业进入队列。

while (!queue.isEmpty()) {
        try {
            Job takenJob = queue.poll(5000, TimeUnit.MILLISECONDS);
            if (takenJob != null) {
                takenJob.execute();
            }
        } catch (InterruptedException e) {
            log.error("ERROR", e);
        }
    }

所以基本上问题是,在我重新上传我的 osgi 项目后,我将丢失对旧线程的引用。

可能的解决方案:我需要定义线程的生命周期,因此我没有池,但每个线程将生存约 15 分钟,然后结束。同时,每 15 分钟就会创建一个新线程,因此我总会有一些线程查看队列。

仅使用标准 java.util.Date getTime() 似乎不是最好的方法。对于如何实现这一点有什么建议吗?

最佳答案

当 bundle 停止时,您必须完成线程并释放所有资源。例如,您可以在 BundleActivator stop 方法中执行此操作。

如果您有新线程,您还应该确保线程在停止函数返回之前完成其工作。这意味着,如果您的作业需要在完成之前运行很长时间(例如由于迭代),则应以可以中断的方式设计它们。

关于java - OSGi 线程永远不会停止运行,为线程定义了固定的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17061320/

相关文章:

java - 在 Java Spring 中检查 XSSFCell cellType 是否为 Date

java - 如何在测试中覆盖单个应用程序属性

Java OpenGL 相机

multithreading - 深度解析CPU和GPU的区别

android - Android中的共享数据和多线程

osgi - Eclipse 插件的延迟激活

java - 根据JavaFX和OSGI开发指导

java - Spring security ignore url 不适用于 we security ignore 方法

Java - 使用多个线程读取/写入内存映射缓冲区(MappedByteBuffer)

osgi - 使用 OSGi HTTP 服务启动 Wicket Web 应用程序