-4

每次当我运行程序时,由于线程 b 的最大优先级分配,执行顺序会发生变化,它应该首先启动并首先完成,因此输出不会相应

threadA.setPriority(Thread.MIN_PRIORITY);
threadB.setPriority(Thread.MAX_PRIORITY)
System.out.println("Start Thread A");
threadA.start();

System.out.println("Start Thread B");
threadB.start();

System.out.println("End of main Thread");
4

3 回答 3

3

我想引用xagyg的回答:

让我们保持简单,直接进入源...

每个线程都有一个优先级。当存在处理资源竞争时,优先级较高的线程通常优先于优先级较低的线程执行。然而,这种偏好并不能保证最高优先级的线程将始终运行,并且线程优先级不能用于可靠地实现互斥。

来自 Java 语言规范(第 2 版)第 445 页。还 ...

尽管 Java 中存在线程优先级,并且许多参考文献指出 JVM 将始终选择最高优先级线程之一进行调度 [52, 56, 89],但目前 Java 语言或虚拟机规范无法保证这一点 [53, 90] . 优先级只是对调度程序的提示 [127,第 227 页]。

摘自测试并发 Java 组件(博士论文,2005 年)p。62.

参考文献 127,第 227 页(摘自上面的摘录)来自组件软件:超越面向对象的编程(C. Szyperski 着),Addison Wesley,1998。

简而言之,不要依赖线程优先级。

链接到帖子

于 2013-10-02T08:02:40.937 回答
1

线程优先级是对操作系统的提示,只有在您使用非常高的 CPU 时才重要,例如所有 CPU 上的 CPU 利用率为 100%。一个线程可以在另一个线程启动所需的时间内运行完成。

顺便说一句:您必须是 Windows 上的管理员,root或者具有setcapLinux 上的权限才能提高优先级。

简而言之,改变优先级几乎是无用的,不能依赖。

于 2013-10-02T07:59:58.340 回答
0

如果您的机器有两个或更多内核运行两个线程(每个线程都分配给自己的内核) - 这是通常的情况 - 那么线程优先级现在可能会生效。每个线程将以最大单核速度运行。

另外:您首先从主线程启动线程 A。然后你启动线程B。你的主线程有多快?线程 A 的完成是否比启动线程 - 线程 B 更快?

如果您想确保执行顺序,则必须使用联接,而不是优先级。

另请参阅Java 线程优先级无效

于 2013-10-02T08:26:40.230 回答