0

我有一个 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()似乎不是最好的方法。有什么建议如何实施吗?

4

2 回答 2

2

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

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

于 2013-06-12T09:01:54.880 回答
2

最好的解决方案是使用 ExecutorService 并在捆绑结束时将其关闭。https://github.com/bndtools/bndtools-rt项目包含一个将此类执行程序注册为服务的包,以确保正确解决所有生命周期问题。

于 2013-06-12T12:41:41.053 回答