守护线程-使用案例

5

守护线程为用户线程提供服务,除了gc外,还有什么场景可以使用守护线程?(任何任务或逻辑都可以放在daemon Threadrun()方法中实现)


1
@user976025 您的帖子应该标记为社区维基,因为它更适合于讨论而不是需要明确和确定的答案。 - Federico Zancan
3个回答

5

以下是你可能需要使用守护线程的一些情况:

  • 收集统计信息和执行状态监控任务 - 发送和接收网络心跳、向监控工具提供服务等。
  • 执行异步 I/O 任务 - 您可以创建一个 I/O 请求队列,并设置一组守护线程异步地处理这些请求。
  • 监听传入连接 - 在这种情况下,守护线程非常方便,因为它们允许您编写一个简单的“永远”循环,而不必创建一个关注主线程退出请求的设置。

我在考虑发送用户统计数据的建议(关于工具性能或用户在该工具上的活动),就像Eclipse或任何其他工具一样,我的意思是在守护线程中生成这些报告,这不是正确的做法吗? - LeandreM
@user976095 绝对的,这类网络 I/O 任务应该在守护线程上完成。对我来说,一般的守护进程/非守护进程“截止点”沿着“为用户”与“为程序”之间的线路进行。发送统计数据肯定是“为程序”,而不是“为用户”。当用户关闭程序时,他们不会欣赏等待您的统计线程完成,因此该线程应以守护模式运行。 - Sergey Kalinichenko
您是在说所有网络I/O都应该在守护线程中发生吗?我有一个JavaScript实现的WebSocket发布者不断地发送数字,以及一个Python实现的Redis订阅者需要侦听这些消息来处理它们,我卡在了是使用普通线程还是守护线程,我正在对传入的数字进行数据分析,您认为哪种线程模式是正确的? - PirateApp
1
@PirateApp 我的意思不是让所有网络I/O都在守护线程上进行,而只是监听传入的连接。一旦连接建立,可以将与已连接对等方通信的流量转移到工作线程。 - Sergey Kalinichenko

2

听起来像是一道作业题哈哈。

你也可以将它们用于IO,因为IO操作会阻塞线程,最好在工作线程中执行。

此外,如果你正在等待下载等网络活动,例如响应post请求,也可以使用它们。


1
守护线程通常用于为应用程序/小程序执行服务(例如加载“琐碎的部分”)。用户线程和守护线程之间的核心区别在于,当所有用户线程终止时,JVM才会关闭程序。当没有用户线程运行时,包括执行的主线程在内,JVM将终止守护线程。简而言之:守护线程不会阻止程序退出;用户线程会阻止程序退出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接