2013-11-15 68 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,但具有更多的控制和更多的工作。