Java后台线程:低优先级

问题描述 投票:0回答:2

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

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

这是我在想的:

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

java multithreading jvm
2个回答
0
投票

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

thread.yield()在许多线程实现中通常是一个无操作,并且在run()方法的开头放置它或睡眠将会做很少或没有,因为你的后台线程还没有真正开始运行。

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

你是正确的,使用线程优先级通常对线程的循环次数几乎没有影响。这取决于你的很多架构,所以我当然会试着看看它是否有帮助。如果你担心某些高性能操作需要从其他更重要的线程开始循环,那么关于你唯一的办法就是用Thread.sleep(...)调用来调整算法中的循环和其他关键位置。它可能确实是hackish但它可能是有效的。

棘手的部分是放置调用的地方,应该使用什么样的睡眠等等。这将需要一些测试和迭代来优化睡眠的位置。此外,如果您正在呼叫第三方图书馆或某些东西,您可能无法将睡眠呼叫置于核心位置。

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


0
投票

由于执行程序是单线程的,因此它只能占用一个核心。只要您的服务器具有N个核心,这些后台任务将永远不会占用服务器负载的1 / N以上,假设它们不会产生新线程或自行调度到其他线程池。

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

© www.soinside.com 2019 - 2024. All rights reserved.