Cor*_*Lee 9 java windows multithreading java-7
这是关于线程优先级的测试.代码来自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();
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我不能得到像这样的常规结果:
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
...
Run Code Online (Sandbox Code Playgroud)
但随机的结果(每次我运行它改变):
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
...
Run Code Online (Sandbox Code Playgroud)
我使用i3-2350M 2C4T CPU和Win 7 64位JDK 7.这有关系吗?
Gra*_*ray 15
Java线程优先级无效
线程优先级适用于大多数操作系统,但它们通常影响很小.优先级有助于仅对运行队列中的线程进行排序,并且不会更改线程在任何主要运行中运行的频率,除非您在每个线程中执行大量CPU.
您的程序看起来使用了大量的CPU,但除非您的内核数少于线程数,否则您可能无法通过设置线程优先级来看到输出顺序的任何变化.如果有空闲CPU,那么即使是优先级较低的线程也会被安排运行.
此外,线程永远不会饿死.即使是较低优先级的线程也会在这种情况下经常运行时间.您应该看到更高优先级的线程被赋予时间切片以更频繁地运行,但这并不意味着较低优先级的线程将等待它们在运行之前完成.
即使优先级有助于为一个线程提供比其他线程更多的CPU,线程程序也会受到竞争条件的影响,这有助于为执行注入大量随机性.然而,您应该看到的是,最优先级线程更可能0
比其余线程更频繁地吐出其消息.如果您将优先级添加到println()
,则应该在多次运行中变得明显.
同样重要的是要注意,System.out.println(...)
正在synchronized
编写IO的方法将极大地影响线程如何交互以及不同的线程相互阻塞.此外,Thread.yield();
根据操作系统的线程调度方式,可以是无操作.
但随机的结果(每次我运行它改变):
对.线程程序的输出很少"完美",因为根据定义,线程是异步运行的.我们希望输出是随机的,因为我们希望线程彼此独立地并行运行.那是他们的力量.如果你期望一些精确的输出,那么你不应该使用线程.
线程优先级不保证执行顺序.它在资源有限时发挥作用.如果系统由于内存或CPU而遇到约束,则优先级较高的线程将首先运行.假设您有足够的系统资源(对于一个简单的程序和您发布的系统资源,我会假设这样),那么您就不会有任何系统限制.这是一篇博文(不是我的帖子),我发现它提供了更多关于它的信息:为什么线程优先级很少重要.
让我们保持简单,直接找到源头......
每个线程都有优先权.当存在处理资源的竞争时,具有较高优先级的线程通常优先于具有较低优先级的线程执行.但是,这种偏好并不能保证最高优先级的线程始终在运行,并且线程优先级不能用于可靠地实现互斥.
还......
尽管Java中存在线程优先级,并且许多引用声明JVM将始终为调度[52,56,89]选择最高优先级线程之一,但Java语言或虚拟机规范目前无法保证[53,90]. .优先级仅是调度程序的提示 [127,第227页].
来自测试并发Java组件(博士论文,2005年).62.
参考文献127,第227页(摘自上面的摘录)来自组件软件:超越面向对象编程(由C. Szyperski提供),Addison Wesley,1998.
简而言之,不要依赖线程优先级.
线程优先级只是OS任务调度程序的提示.任务调度程序只会尝试将更多资源分配给具有更高优先级的线程,但是没有明确的保证.
实际上,它不仅与Java或JVM相关.大多数非实时操作系统仅以建议的方式使用线程优先级(托管或非托管).
Jeff Atwood在这个话题上发表了一篇好文章:" 线程优先级是邪恶的 "
这是问题所在.如果有人开始工作,将使'cond'在较低优先级的线程(生产者)上成立,然后程序的时间是这样的,即发出此旋转的较高优先级线程(消费者)被安排,消费者将完全挨饿生产者.这是一场经典的比赛.即使在那里有明确的Sleep,发布它也不允许生产者被安排,因为它的优先级较低.消费者将永远旋转,除非开放免费CPU,否则生产者永远不会生产.哎呀!
归档时间: |
|
查看次数: |
10358 次 |
最近记录: |