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

时间:2013-06-12 08:49:31

标签: 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()似乎不是最好的方法。有任何建议如何实现这个?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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