【问题标题】:Manage a pool of daemons threads管理一个守护线程池
【发布时间】:2013-11-28 20:45:12
【问题描述】:

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

在创建时我这样做是为了激活:

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

现在可以了,但是如果我想停用并删除它们。 Deactivate 停止进程事件(与http://docs.oracle.com/javase/tutorial/essential/io/notification.html 中的方法相同)并且应该释放线程。删除应该只销毁守护进程。

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

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

【问题讨论】:

  • 您真的需要守护进程,还是可以使用在传统 Executor 中执行的独立任务(从已处理的事件生成)重新表述您的问题?
  • 守护进程只是一个命名约定。 Daemon 是一个有 watchservice 的类,仅此而已。很抱歉造成混乱。

标签: java multithreading daemon watchservice


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多