【问题标题】:Java background thread: low priortyJava后台线程:低优先级
【发布时间】:2017-08-19 22:38:28
【问题描述】:

我有一个具有后台线程的网络应用程序。这个线程,它是一个 Executors.newSingleThreadExecutor 被赋予了被认为是低优先级的任务:我不在乎它们什么时候完成。提交的任务通常是一种记录到远程数据库的类型。

我多次阅读到,不应使用 Thread.setPriority 更改线程的实际优先级。既然如此,我不希望我的后台任务干扰我的服务器更重要的任务。可以使用哪些策略?

这是我的想法:

我正在考虑将 Thread.sleep(1) 或 yeild() 放在后台任务的 run() 方法的开头。这将允许其他线程在此时有事可做。但是,这似乎很骇人听闻。有什么建议吗?

【问题讨论】:

  • 你在哪里读过很多遍?如果你知道你想做什么,那就去做。它可能没有你想象的那么大的效果,这可能是你未说明的消息来源告诉你的,但如果这是你认为你需要的,你需要它。

标签: java multithreading jvm


【解决方案1】:

我正在考虑将 Thread.sleep(1) 或 yeild() 放在后台任务的 run() 方法的开头。如果他们在那一刻有事要做,这将允许其他线程向前跳。但是,这似乎很骇人听闻。有什么建议吗?

thread.yield() 在许多线程实现中通常是无操作的,并且在 run() 方法的开头放置它或休眠将几乎没有作用,因为您的后台线程还没有真正开始运行。

我不希望我的后台任务干扰我的服务器更重要的任务。可以使用哪些策略?

您是正确的,使用线程优先级通常对线程将被赋予的周期数几乎没有影响。然而,这取决于你的很多架构,所以我肯定会尝试他们看看它是否有帮助。如果您担心某些高性能操作会占用其他更重要的线程的周期,那么您唯一的办法就是使用Thread.sleep(...) 调用在您的算法中的循环和其他关键位置进行填充。这可能确实有点骇人听闻,但它可能很有效。

棘手的部分是在哪里放置调用,应该使用什么millis sleep,等等。这需要一些测试和迭代来优化sleep 的位置。此外,如果您正在调用 3rd 方库或其他东西,您可能无论如何都无法将睡眠调用放在核心位置。

如果它不起作用或者您无法访问正确的痛点,那么您可能别无选择,只能将后台处理卸载到远程系统进行处理。

【讨论】:

    【解决方案2】:

    由于执行器是单线程的,它只能占用一个核心。只要您的服务器有 N 个内核,这些后台任务将永远不会占用超过 1/N 的服务器负载,假设它们不会自行生成新线程或分派到其他线程池。

    或者,您可以通过一个配置有priority queue 的线程池来调度所有 任务(低优先级和高优先级),并装饰每个后台任务,使其具有低优先级。 IE。您可以将调度从内核移动到用户空间。

    【讨论】:

    • 我有一个单核 VPS。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2014-11-26
    • 1970-01-01
    • 2011-04-19
    • 2014-10-27
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多