任何线程是否应该驻留在线程池之外?

时间:2011-07-08 14:01:05

标签: java multithreading

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

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

连接侦听和连接处理也是两回事。从这个角度来看,连接侦听器也不应该与连接处理程序合并。

答案 4 :(得分:0)

SImilar对@ larsman的评论,我会做你觉得更简单,更清晰的事情。我倾向于使用一个线程池来处理所有事情,因为它似乎更容易管理。您不必这样做,并且侦听任务可以是它自己的线程。