Java后台主题:低优先级

时间:2017-08-19 22:38:28

标签: java multithreading jvm

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

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

以下是我的想法:

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

  

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

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

  

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

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

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

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