首页 / JAVA / Java线程优先级无效
Java线程优先级无效
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java线程优先级无效,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2885字,纯文字阅读大概需要5分钟。
内容图文
![Java线程优先级无效](/upload/InfoBanner/zyjiaocheng/715/0504a447a00d4e9b9e04c495804f72d7.jpg)
这是关于线程优先级的测试.
代码来自Thinking in Java p.809
import java.util.concurrent.*;
public class SimplePriorities implements Runnable {
private int countDown = 5;
private volatile double d; // No optimization
private int priority;
public SimplePriorities(int priority) {
this.priority = priority;
}
public String toString() {
return Thread.currentThread() + ": " + countDown;
}
public void run() {
Thread.currentThread().setPriority(priority);
while (true) {
// An expensive, interruptable operation:
for (int i = 1; i < 10000000; i++) {
d += (Math.PI + Math.E) / (double) i;
if (i % 1000 == 0)
Thread.yield();
}
System.out.println(this);
if (--countDown == 0)
return;
}
}
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++)
exec.execute(new SimplePriorities(Thread.MIN_PRIORITY));
exec.execute(new SimplePriorities(Thread.MAX_PRIORITY));
exec.shutdown();
}
}
我想知道为什么我不能得到像这样的常规结果:
Thread[pool-1-thread-6,10,main]: 5
Thread[pool-1-thread-6,10,main]: 4
Thread[pool-1-thread-6,10,main]: 3
Thread[pool-1-thread-6,10,main]: 2
Thread[pool-1-thread-6,10,main]: 1
Thread[pool-1-thread-3,1,main]: 5
Thread[pool-1-thread-2,1,main]: 5
Thread[pool-1-thread-1,1,main]: 5
Thread[pool-1-thread-5,1,main]: 5
Thread[pool-1-thread-4,1,main]: 5
...
但随机的结果(每次我运行它改变):
Thread[pool-1-thread-2,1,main]: 5
Thread[pool-1-thread-3,1,main]: 5
Thread[pool-1-thread-4,1,main]: 5
Thread[pool-1-thread-2,1,main]: 4
Thread[pool-1-thread-3,1,main]: 4
Thread[pool-1-thread-1,1,main]: 5
Thread[pool-1-thread-6,10,main]: 5
Thread[pool-1-thread-5,1,main]: 5
...
我使用i3-2350M 2C4T CPU和Win 7 64位JDK 7.
有关系吗 ?
解决方法:
Java Thread priority has no effect
线程优先级适用于大多数操作系统,但它们通常影响很小.优先级有助于仅对运行队列中的线程进行排序,并且不会更改线程在任何主要运行中运行的频率,除非您在每个线程中执行大量CPU.
您的程序看起来使用了大量的CPU,但除非您的内核数少于线程数,否则您可能无法通过设置线程优先级来看到输出顺序的任何变化.如果有空闲CPU,那么即使是优先级较低的线程也会被安排运行.
此外,线程永远不会饿死.即使是较低优先级的线程也会在这种情况下经常运行时间.您应该看到更高优先级的线程被赋予时间切片以更频繁地运行,但这并不意味着较低优先级的线程将等待它们在运行之前完成.
即使优先级确实有助于为一个线程提供比其他线程更多的CPU,但线程程序受到race conditions的约束,这有助于为其执行注入大量随机性.然而,您应该看到的是,最优先级线程更可能比其余线程更频繁地吐出其0消息.如果将优先级添加到println(),那么在多次运行中这应该是显而易见的.
同样重要的是要注意System.out.println(…)是正在编写IO的同步方法,这将极大地影响线程如何交互以及不同线程相互阻塞.另外,Thread.yield();可以是无操作,具体取决于操作系统如何进行其线程调度.
but a random result (every time I run it changes):
对.线程程序的输出很少“完美”,因为根据定义,线程是异步运行的.我们希望输出是随机的,因为我们希望线程彼此独立地并行运行.那是他们的力量.如果你期望一些精确的输出,那么你不应该使用线程.
内容总结
以上是互联网集市为您收集整理的Java线程优先级无效全部内容,希望文章能够帮你解决Java线程优先级无效所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。