2011-07-08 104 views
0

当使用线程池时,是否仍然使用单个线程对象来执行特定任务是有益的。我想知道在Java中的服务器,是否正在监听连接的线程应该与其他任何线程共享其资源,然后从这一个监听线程分配它们?由于我对这个概念并不熟悉,所以我也可能会忽略这一点。任何线程是否应该驻留在线程池之外?

+2

是的,我没有看到为什么要将接受线程放入线程池的原因。 – Kaj

+0

好吧,那太好了 - 我只想知道。 – Titus

回答

2

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

0

我会创建两个池,一个用于监听,另一个用于内部任务。这样你就永远不会让你的服务器处于无法监听连接的风险之中。

如果内部任务只是一个线程,那么它可以很小,但至少它是安全隔离的。

+0

这个答案对我很有用,因为我也不确定使用多线程池是否是好的做法,所以谢谢。 – Titus

+1

我会听完任务循环直到完成并且永不放弃线程。这样,另一个线程就不能把听力任务置于风险之中。 –

0

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

0

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

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

连接监听和连接处理也是两回事。从这个角度来看,连接监听器也不应该与连接处理器混合使用。

0

类似于@拉斯曼的评论,我会做你觉得更简单,更清晰的事情。我一直倾向于使用一个线程池,因为它似乎更容易管理。你不必这样做,听音任务可以是自己的线程。

相关问题