Java线程优先级无效
线程优先级是高度特定于操作系统的,并且在许多操作系统上的影响通常很小。优先级有助于仅对运行队列中的线程进行排序,并且不会改变线程在任何主要线程中运行的频率,除非您在每个线程中都花费大量的CPU资源。
您的程序看起来会占用大量CPU,但是除非内核数量少于线程数量,否则通过设置线程优先级,您可能看不到输出顺序的任何变化。如果有可用的CPU,那么甚至将安排较低优先级的线程运行。
而且,线程永远不会饿死。即使是较低优先级的线程也将有时间在这种情况下经常运行。您应该看到优先级较高的线程被分配了 更多的
时间运行,但这并不意味着优先级较低的线程将在运行它们之前等待它们完成。
即使优先级确实有助于给一个线程比其他线程更多的CPU,线程程序也要遵守竞争条件,这有助于为其执行注入大量随机性。但是,您应该看到的是,最大优先级线程
0比其他线程更频繁地吐出其消息。如果您将优先级添加到
println(),则在多次运行后应该会变得很明显。
还需要注意的
System.out.println(...)是
synchronized,正在编写IO的方法将极大地影响线程之间的交互方式以及不同线程之间的相互阻塞。此外,
Thread.yield();根据操作系统如何进行线程调度,可以设置为空操作。
但是结果是随机的(每次运行时都会改变):
对。线程程序的输出很少“完美”,因为根据定义,线程是异步运行的。我们希望输出是随机的,因为我们希望线程彼此独立地并行运行。那就是他们的力量。如果希望得到精确的输出,则不应使用线程。



