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



我有一个线程池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。日期 getTime()似乎不是最好的方法。有什么建议如何实现这一点吗?

你必须在bundle停止时完成线程并释放所有资源。例如,你可以在BundleActivator stop方法中这样做。

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

最好的解决方案是使用ExecutorService并在bundle结束时关闭它。https://github.com/bndtools/bndtools-rt项目包含一个bundle,它将这样的执行器注册为服务,确保所有生命周期问题都得到正确解决。

最新更新