Java OSGi线程从不停止运行,为线程定义了固定的生存期

Java OSGi线程从不停止运行,为线程定义了固定的生存期,java,multithreading,osgi,threadpool,runnable,Java,Multithreading,Osgi,Threadpool,Runnable,我有一个5的线程池,我将其保存在数组中: private static final Collection<Thread> workerThreads = new ArrayList<Thread>(); 所以基本上问题是,在我重新加载我的osgi项目之后,我将失去对旧线程的引用 可能的解决方案:我需要为线程定义一个生存期,所以我没有一个池,但每个线程将生存约15分钟,然后结束。同时,每15分钟创建一个新线程,因此我将始终有一些线程查看队列 仅仅使用标准的java.uti

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

private static final Collection<Thread> workerThreads = new ArrayList<Thread>();
所以基本上问题是,在我重新加载我的osgi项目之后,我将失去对旧线程的引用

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


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

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


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

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


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

最佳解决方案是使用ExecutorService,并在捆绑结束时关闭它。该项目包含一个捆绑包,该捆绑包将此类执行器注册为服务,以确保所有生命周期问题都得到正确解决。

最佳解决方案是使用一个执行器服务,并在捆绑包结束时关闭它。该项目包含一个捆绑包,将此类执行者注册为服务,确保所有生命周期问题都得到正确解决

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