2013-07-24 34 views
5

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

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

+3

试图改变JVM的这种低级设置通常是一个非常糟糕的主意。你想通过改变线程的执行顺序来解决什么问题? – ssindelar

回答

8

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

所以从Java的角度来看,你不能改变调度算法。调度是自动完成的。

Java中唯一可以做的事情是set the priority of the thread。但是如何影响调度算法没有定义。

您可以尝试更改运行虚拟机的操作系统的调度算法。但是这非常依赖于所使用的操作系统。

2

在过去的10年左右,JVM线程是系统级线程,而不是用户级('绿色')线程。即使对于用户级线程,您也无法管理它们(JVM)。

1

JVM规范没有说明线程应该如何由实现进行调度。 Hotspot虚拟机(也可能几乎每个其他实现)都使用操作系统调度机制(如Uwe所述)。另见What is the JVM Scheduling algorithm?

一个简单但很可能不是非常有效的方式来影响应用程序线程的调度将只有n个可运行的线程供操作系统调度(n是实际希望并行运行的线程数)。 那可能是做你自己的ExecutorService实现,它使你不想被OS调度的所有线程等到你认为它们应该运行。 当然,这种方式对其他VM线程没有任何影响,更不用说其他应用程序或操作系统了。

涉及更多(而不是平台独立)的是将操作系统调度器本身改为更适合JVM需求的东西。谷歌的一项快速研究发现this abstract,我想这个领域还有更多的工作要做。

0

在Effective Java,2nd Ed。中,Joshua Bloch致力于讨论线程调度问题。他继续深入探讨如何调整线程调度通常只会导致JVM实现相关,不可移植和易碎的解决方案。

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

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

0

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

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

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