如何安排Java线程

时间:2013-07-24 07:06:22

标签: java multithreading scheduling

我已经读过Java线程是用户级线程,用户级线程和内核级线程之间的区别之一是内核级别线程由内核调度(我们无法更改),对于用户级线程我们可以定义我们自己的调度算法。

那么我们如何在Java中安排线程?在任何给定时间,当准备好执行多个线程时,运行时系统选择具有最高优先级的Runnable线程来执行。如果两个具有相同优先级的线程正在等待CPU,则调度程序选择其中一个以循环方式运行。如果我不想要RR怎么办?有没有办法可以改变它,或者我错过了什么?

5 个答案:

答案 0 :(得分:8)

您无法更改调度算法,因为JVM超出了范围。 JVM使用底层操作系统提供的用户线程的线程。

因此,从Java的角度来看,您无法更改调度算法。调度是自动完成的。

Java中唯一能做的就是set the priority of the thread。但是这没有定义如何影响调度算法。

您可以尝试更改运行VM的操作系统的调度算法。但这高度依赖于所使用的操作系统。

答案 1 :(得分:2)

在过去10年左右的时间里,JVM线程是系统级线程,而不是用户级(“绿色”)线程。即使对于用户级线程,您也无法管理它们(JVM会这样做)。

答案 2 :(得分:1)

JVM Spec没有说明实现如何调度线程。 Hotspot VM(很可能几乎所有其他实现)都使用OS调度机制(如Uwe所述)。另请参阅What is the JVM Scheduling algorithm?

影响应用程序线程调度的一种简单但非常有效的方法是只有n个可运行的线程供操作系统调度(n是你实际想要并行运行的线程数) 。 这可能是例如是您自己的ExecutorService实现,它使您不希望由OS安排的所有线程等到您认为它们应该运行。 当然,这样您就不会对其他VM线程产生任何影响,更不用说其他应用程序或操作系统了。

更多涉及(而不是平台独立)将是将OS调度程序本身更改为更适合JVM需求的内容。一个快速的谷歌研究发现this abstract,我想在这个领域还有更多的工作要做。

答案 3 :(得分:0)

在Effective Java,2nd Ed。中,Joshua Bloch将一个项目用于讨论线程调度。他详细介绍了如何尝试调整线程调度通常只会导致JVM实现依赖,不可移植和易碎的解决方案。

如果您遇到特定的调度问题,那么对于新代码,您不应该处理低级别的线程调用。 Java具有更高级别的并发库,可简化许多这些任务。你应该考虑Executors和Tasks,而不是用线程定义问题的解决方案。还有更高级别的工具可以简化线程间通信,例如CountDownLatch。

低级线程调用(如wait,notify和notifyAll)可能很难正确执行。

答案 4 :(得分:0)

您可以编写自己的线程调度程序,类似于批处理作业的Quartz job scheduler

这将允许您在应用程序运行期间的一天中的不同时间执行线程。

如果您只想确定线程执行的顺序,请从一个主线程执行代码。