0

我必须处理一组守护进程,每个守护进程都实现了一个监视服务。我想要做的是,创建守护进程,激活它们,停用和删除。

在创建的那一刻,我这样做是为了激活:

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

现在这有效,但如果我想停用并删除它们。Deactivate 停止 processevents(与http://docs.oracle.com/javase/tutorial/essential/io/notification.html中的方法相同)并且应该释放线程。删除应该只是破坏守护程序。

我正在考虑使用线程池,但不确定实现和类型。我不想要一个固定的线程池,因为我不知道所需的守护进程的数量。缓存线程池似乎就足够了,但文档告诉我它只适用于“启动许多短期任务的应用程序”,而守护进程可能会运行很长时间。

我将如何最好地安全地管理、激活和停用一组守护程序(监视服务)?

4

1 回答 1

1

如果适合您的任务,执行器就可以了,“短期”只是一个提示,但不是必需的。问题是,如果您有一个池,假设有 10 个线程,并通过等待特定事件使所有 10 个线程保持忙碌,则在此期间无法处理其他任务,因为所有 10 个线程都忙。

有两种方法可以解决这个问题:首先,您可以通过创建固定大小的线程池来确保池中有足够的线程来处理所有任务,或者通过使用调度程序模型,其中一个调度程序在每个事件上唤醒,但随后只是将该事件的处理分派给该池中的线程,否则该线程处于空闲状态。

另一方面,您可以使用 ThreadGroup / ThreadFactory 并自己创建线程,这基本上是固定的 ThreadPoolExecutor,但您可以进行更多控制和更多工作。

于 2013-11-16T11:56:48.733 回答