2013-11-15 102 views
0

我必須處理一組守護進程,每個守護進程實現一個watchservice。 我想要做的就是創建守護進程,激活它們,停用並移除。管理一個守護進程線程池

在在創建此刻我這樣做是爲了激活:

 private void activateDaemon(Daemon daemon){ 
      Thread thread = new Thread(){ 
        @Override 
        public void run(){ 
          daemon.processEvents(); 
        } 
      }; 
      thread.start(); 
    } 

現在這個工作,但如果我要停用並刪除它們。停用停止進程事件(與http://docs.oracle.com/javase/tutorial/essential/io/notification.html中的方法相同)並且應該釋放該線程。刪除應該破壞守護進程。

我正在考慮使用線程池,但我不確定實現和類型。我不想要一個固定的線程池,因爲我不知道需要的守護進程的數量。一個緩存線程池似乎是足夠的,但文檔告訴我它只適用於「啓動許多短期任務的應用程序」,而守護進程可能會運行很長時間。

我該如何最好地去安全地管理,激活和關閉一組守護進程(watchservices)?

+0

您是否真的需要守護進程,或者您可以使用在傳統執行程序中執行的獨立任務(從處理的事件生成)重新解釋您的問題? –

+0

守護進程只是一個命名約定。守護進程是一個有watchservice的類,沒有什麼比這更少的了。對困惑感到抱歉。 – Sven

回答

1

一個執行器就好,如果這符合你的任務,「短命」只是一個提示,但不是必需的。問題是,如果有一個可以說10個線程的池,並通過等待某個特定事件來保持所有10個線程繁忙,則在此期間不能處理其他任務,因爲所有10個線程都很忙。

有兩種解決方法:首先,您可以簡單地確保池中有足夠的線程通過創建固定大小的線程池來處理所有任務,或者通過使用調度程序模型來處理所有任務,其中一個調度程序在每個事件中醒來,但隨後將該事件的處理分派給該池中的線程,否則該線程處於空閒狀態。

另一方面,您可以使用ThreadGroup/ThreadFactory並自行創建線程,該線程基本上是固定的ThreadPoolExecutor,但具有更多的控制和更多的工作。