这是关于线程优先级的测试。该代码来自《 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
...
我在Win 7 64位JDK 7中使用i3-2350M 2C4T CPU,这有关系吗?
Java线程优先级无效
线程优先级是高度特定于操作系统的,并且在许多操作系统上的影响通常很小。优先级有助于仅对运行队列中的线程进行排序,并且不会改变线程在任何主要线程中运行的频率,除非您在每个线程中都花费大量的CPU资源。
您的程序看起来会占用大量CPU,但是除非内核数量少于线程数量,否则通过设置线程优先级,您可能看不到输出顺序的任何变化。如果有可用的CPU,那么甚至将安排较低优先级的线程运行。
而且,线程永远不会饿死。即使是较低优先级的线程也将有时间在这种情况下经常运行。您应该看到优先级较高的线程被分配了 更多的
时间运行,但这并不意味着优先级较低的线程将在运行它们之前等待它们完成。
即使优先级确实有助于给一个线程比其他线程更多的CPU,线程程序也要遵守竞争条件,这有助于为其执行注入大量随机性。但是,您应该看到的是,最大优先级线程0
比其他线程更频繁地吐出其消息。如果您将优先级添加到println()
,则在多次运行后应该会变得很明显。
还需要注意的System.out.println(...)
是synchronized
,正在编写IO的方法将极大地影响线程之间的交互方式以及不同线程之间的相互阻塞。此外,Thread.yield();
根据操作系统如何进行线程调度,可以设置为空操作。
但是结果是随机的(每次运行时都会改变):
对。线程程序的输出很少“完美”,因为根据定义,线程是异步运行的。我们希望输出是随机的,因为我们希望线程彼此独立地并行运行。那就是他们的力量。如果希望得到精确的输出,则不应使用线程。
主要内容:1 什么是Java 线程优先级,2 Thread类线程优先级常量,3 Java 线程优先级的例子1 什么是Java 线程优先级 每个线程都有一个优先级。优先级由1到10之间的数字表示。在大多数情况下,线程计划会根据线程的优先级来调度线程(称为抢先式调度)。但是不能保证一定被调用,因为是否被调用取决于JVM选择谁来调度。 2 Thread类线程优先级常量 public static int MIN_PRIORITY public static int NORM_PRIORITY publ
问题内容: Java API线程优先级(1-10)如何转换为操作系统级别的优先级,因为大多数操作系统没有与此相匹配的线程优先级别(就数量而言)。 因此请记住,在某些情况下,具有不同优先级的两个或多个线程最终会在OS级别获得相同的优先级。 如果我的理解有需要更正,请澄清。 问题答案: 实际上,某些优先级可以映射到相同的“本地”优先级。这是列表(基于OpenJDK 6中的Hotspot代码): Sol
问题内容: 我有一个在几个线程中运行的程序。主线程与其他线程共享一个对象,在主线程中,我需要调用: 我怀疑主线程饿了,无法访问。如何提高主线程的优先级,或者默认情况下它是否已高于其他线程? 问题答案: 您在Thread类中有一个setPriority()方法。 检查此javadoc。 将线程优先级设置为最大:
我目前正在研究分布式应用程序的性能。我的目标是网络组件。目前,每个连接都有一个专用线程,在阻塞模式下处理套接字。我的目标是减少线程数量(不降低性能),如果可能的话,提高性能。 我重新设计了网络组件以使用异步通信,并尝试使用1到2个线程来处理整个网络。我做了一个简单的测试,我从一个节点在一个循环中写入,然后在另一个节点上读取,这是为了测试最大nw线程能力,我发现我的繁忙循环实现消耗了100%的cpu
本文向大家介绍说说线程优先级?相关面试题,主要包含被问及说说线程优先级?时的应答技巧和注意事项,需要的朋友参考一下 理论上来说系统会根据优先级来决定首先使哪个线程进入运行状态。当 CPU 比较闲的时候,设置线程优先级几乎不会有任何作用,而且很多操作系统压根不会不会理会你设置的线程优先级,所以不要让业务过度依赖于线程的优先级。 另外,线程优先级具有继承特性比如 A 线程启动 B 线程,则 B 线程的
本文向大家介绍java线程优先级原理详解,包括了java线程优先级原理详解的使用技巧和注意事项,需要的朋友参考一下 java 中的线程优先级的范围是1~10,默认的优先级是5。10最高。 MIN_PRIORITY 1 MAX_PRIORITY 10 NORM_PRIORITY 5 优先级高的获得cpu的几率更大些,不是优先级高的就先执行完,线程优先级随机特性 在java中,线程的优先级具有继承性,