2013-06-12 74 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項目包含一個捆綁包,它將這樣的執行程序註冊爲服務,確保正確解決所有生命週期問題。