我正在尝试测试2个线程,一个具有高优先级,另一个具有低优先级。
根据我的结果,有时低优先级线程更快,这是怎么可能的?我通过在每个线程中增加一个click变量来测试不同优先级的线程。我也增加或减少了睡眠时间,但没有效果。
由于我没有在后台运行繁重的程序,所以我决定在运行高清电影的情况下进行测试,但仍然没有真正的变化,线程总是相同的速度。
我的电脑是英特尔i5。我正在运行Windows 7 64bit, 16GB RAM
这是代码:class clicker implements Runnable{
long click =0;
Thread t;
private volatile boolean running = true;
clicker(int p){
t=new Thread(this);
t.setPriority(p);
}
public void run(){
while(running)
click++;
}
public void stop(){
running = false;
}
public void start(){
t.start();
}
}
class HiLoPri {
public static void main(String args[]){
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
clicker hi=new clicker(Thread.NORM_PRIORITY+4);
clicker lo=new clicker(Thread.NORM_PRIORITY-4);
lo.start();
hi.start();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
lo.stop();
hi.stop();
try {
hi.t.join();
lo.t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("LO: "+lo.click);
System.out.println("HI: "+hi.click);
}
}
你有两个问题。一个是线程需要一段时间来启动,所以你通过连续地启动它们给"Low"一个很好的开始。另一个是线程优先级决定处理器时间有参数时谁可以运行。有了两个线程和8个有效的处理器内核,优先级就不那么重要了!下面是一个固定的示例,它使用锁存器"同时"启动所有线程,并且使用足够多的线程,它们实际上会争夺资源,您可以看到优先级设置的效果。它给出了相当一致的结果。
static class Clicker implements Runnable{
BigInteger click = BigInteger.ZERO;
Thread t;
Clicker(int p){
t=new Thread(this);
t.setPriority(p);
}
public void run(){
try {
latch.await();
} catch(InterruptedException ie) {}
while(running)
click = click.add(BigInteger.ONE);
}
public void start(){
t.start();
}
}
public static volatile boolean running = true;
public static final CountDownLatch latch = new CountDownLatch(1);
public static void main(String args[]){
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
List<Clicker> listLow = new ArrayList<Clicker>();
List<Clicker> listHigh = new ArrayList<Clicker>();
for (int i = 0; i < 16; i++) {
listHigh.add(new Clicker(Thread.NORM_PRIORITY+4));
}
for (int i = 0; i < 16; i++) {
listLow.add(new Clicker(Thread.NORM_PRIORITY-4));
}
for (Clicker clicker: listLow) {
clicker.start();
}
for (Clicker clicker: listHigh) {
clicker.start();
}
latch.countDown();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
running = false;
BigInteger lowTotal = BigInteger.ZERO;
BigInteger highTotal = BigInteger.ZERO;
try {
for (Clicker clicker: listLow) {
clicker.t.join();
lowTotal = lowTotal.add(clicker.click);
}
for (Clicker clicker: listHigh) {
clicker.t.join();
highTotal = highTotal.add(clicker.click);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("LO: "+lowTotal);
System.out.println("HI: "+highTotal);
}
线程优先级不保证有任何影响;在很多地方都提到了这一点,包括JDK javadoc。所以假设你运行的平台基本上忽略了级别,那么它就回到了基本的统计概率:有时一些线程似乎比其他线程运行得更快,这取决于调度程序的工作方式等等。
我不认为有人真的使用Java线程优先级的一切,考虑到他们的工作(或缺乏)是最好的平台相关的。