当使用线程池时,是否仍然使用单个线程对象来执行特定任务是有益的。我想知道在Java中的服务器,是否正在监听连接的线程应该与其他任何线程共享其资源,然后从这一个监听线程分配它们?由于我对这个概念并不熟悉,所以我也可能会忽略这一点。任何线程是否应该驻留在线程池之外?
回答
是的,必须同时运行的单个任务可以在线程池之外拥有自己的线程。强制每个线程成为池的一部分可能会掩盖您的设计,因为您需要各种机制来使并发任务看起来像工作线程。
我会创建两个池,一个用于监听,另一个用于内部任务。这样你就永远不会让你的服务器处于无法监听连接的风险之中。
如果内部任务只是一个线程,那么它可以很小,但至少它是安全隔离的。
这个答案对我很有用,因为我也不确定使用多线程池是否是好的做法,所以谢谢。 – Titus
我会听完任务循环直到完成并且永不放弃线程。这样,另一个线程就不能把听力任务置于风险之中。 –
如果您的服务器需要维护全局应用程序状态(例如,使用AtomicLong处理服务器提供的请求数量等),则可能需要资源共享。您的主线程通常会等待,准备好接受传入的连接/请求。然后更新全局状态(如命中计数器),根据新请求(通常是Runnable或Callable)创建一个新的“作业”,并将其提交给线程池(java.util.concurrent)提供它们。
线程池的目的只是为了帮助您管理线程。换句话说,线程池为您处理线程的创建和终止,并为空闲线程提供工作。被阻塞或等待的线程将不会收到新任务。
您的连接侦听器可能会处于等待连接的无限循环中,因此永远不会闲置(尽管它可能处于等待状态)。由于这种情况,连接监听器线程将永远无法接收新任务,因此将其与其他线程合并是没有意义的。
连接监听和连接处理也是两回事。从这个角度来看,连接监听器也不应该与连接处理器混合使用。
类似于@拉斯曼的评论,我会做你觉得更简单,更清晰的事情。我一直倾向于使用一个线程池,因为它似乎更容易管理。你不必这样做,听音任务可以是自己的线程。
- 1. 检查线程池是否有任何活动线程
- 2. 线程是否由线程池管理?
- 3. 线程池是否在应用程序域之间共享?
- 4. 应该在主线程之外的线程中调用URLForUbiquityContainerIdentifier:
- 5. 如果该线程来自线程池,Task.Wait是否会释放调用线程?
- 6. 线程池例外
- 7. 是否同步驻留像Lock.lock()这样的并发线程?
- 8. 将java线程池中的线程作为守护程序线程是否存在任何问题
- 9. 如何知道所有线程池的线程是否已完成其任务?
- 10. 创建的线程实例驻留在Heap中还是任何其他位置?
- 11. 线程池是否可以在单线程函数上运行?
- 12. 线程池,多线程,异步等。我应该使用什么?
- 13. 任务vs线程池
- 14. 与线程池链责任
- 15. 多线程实例访问时是否是线程池线程安全?
- 16. 线程:如何中断该线程外部的线程
- 17. 多线程 - 新线程vs线程池
- 18. 一组线程(线程组)是否可以使用线程池ExecutorService或任何方法一次启动?
- 19. 线程池中的线程
- 20. 线程池最大线程
- 21. 我应该使用线程池或任务并行库
- 22. 是否有最大线程数的Silverlight线程池?
- 23. Parallel.ForEach是否使用ASP.NET线程池中的线程?
- 24. 线程池是否按顺序运行?
- 25. 在tomcat的线程池中,当线程返回到池时,线程本地值是否被重置或删除?
- 26. 如何使升压线程池::线程
- 27. 在线程池中的任务之间但不是在Java线程之间共享对象
- 28. 线程池在C#
- 29. 在一个线程池管理线程
- 30. 在线程池中组织任务
是的,我没有看到为什么要将接受线程放入线程池的原因。 – Kaj
好吧,那太好了 - 我只想知道。 – Titus