【问题标题】:Should any threads reside outside of the thread pool?是否应该有任何线程驻留在线程池之外?
【发布时间】:2011-07-08 14:01:04
【问题描述】:

在使用线程池时,仍然对特定任务使用单个线程对象是否有益。我想知道在 Java 中的服务器方面,正在侦听连接的线程是否应该与任何其他线程共享其资源,然后从这个侦听线程分配?由于我不熟悉这个概念,因此我也可能错过了重点。

【问题讨论】:

  • 是的,我看不出为什么要将接受线程放在线程池中。
  • 好的,太好了——我想知道的。

标签: java multithreading


【解决方案1】:

是的,必须并发运行的单个任务可以在线程池之外拥有自己的线程。强制每个线程成为池的一部分可能会混淆您的设计,因为您需要各种机制来使并发任务看起来像工作线程。

【讨论】:

    【解决方案2】:

    我会创建两个池,一个用于监听,一个用于内部任务。这样,您就不会让您的服务器面临无法侦听连接的风险。

    如果内部任务池偶尔只是一个线程,它可能会很小,但至少它是安全隔离的。

    【讨论】:

    • 这个答案对我很有用,因为我也不确定使用多个线程池是否是一种好习惯,所以谢谢。
    • 我会一直监听任务循环直到完成并且永远不会放弃线程。这样,另一个线程就不能将监听任务置于危险之中。
    【解决方案3】:

    在您的服务器需要维护全局应用程序状态的情况下(例如,使用 AtomicLong 来确定服务器所服务的请求数量等),可能需要资源共享。您的主线程通常会等待,准备好接受传入的连接/请求。然后更新全局状态(如命中计数器),根据新请求(通常是 Runnable 或 Callable)创建一个新的“作业”,并将其提交到提供它们的线程池 (java.util.concurrent)。

    【讨论】:

      【解决方案4】:

      线程池的目的只是帮助您管理线程。换句话说,线程池为您处理线程的创建和终止,并为空闲线程提供工作。被阻塞或等待的线程将不会收到新任务。

      您的连接侦听器可能处于无限循环中等待连接,因此永远不会空闲(尽管它可能处于等待状态)。既然是这种情况,连接侦听器线程将永远无法接收新任务,因此将其与其他线程池化是没有意义的。

      连接监听和连接处理也是两个不同的东西。从这个角度来看,连接侦听器也不应该与连接处理程序池化。

      【讨论】:

        【解决方案5】:

        类似于@larsman 的评论,我会做任何你觉得更简单和更清晰的事情。我倾向于对所有事情都使用一个线程池,因为它似乎更容易管理。你不必那样做,监听任务可以是它自己的线程。

        【讨论】:

          猜你喜欢
          • 2012-06-11
          • 1970-01-01
          • 2012-02-21
          • 1970-01-01
          • 1970-01-01
          • 2011-02-09
          • 2016-09-26
          • 2018-12-11
          • 2013-04-05
          相关资源
          最近更新 更多