2013-06-12 66 views
0

我havea线程池的5,这是我保持阵列固定的一生:OSGi的线程从未停止运行,定义线程

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.DategetTime()似乎不是最好的方式。任何建议如何实现这一点?

回答

1

你必须完成你的线程时解除捆停止所有的资源。您可以在BundleActivator停止方法中执行此操作。

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

2

最好的解决方法是使用一个ExecutorService的,并且当束端部关闭。 https://github.com/bndtools/bndtools-rt项目包含一个捆绑包,它将这样的执行程序注册为服务,确保正确解决所有生命周期问题。