我想测试2个线程,一个高,和其他与低优先级。
根据我的结果有时低优先级线程是快,这怎么可能? 我已经通过测试增量的不同优先级的线程每个线程内点击变量。 我还增加和减少睡眠时间,但一无所获。
因为我是用在后台运行,没有沉重的程序测试,我决定用一个高清电影的运行测试,但仍然没有真正的改变,线程都是一样的速度。
我的电脑是英特尔酷睿i5。 我运行Windows 7 64位,16GB内存
这是代码:
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);
}
}
你有两个问题。 其中之一是,线程需要一段时间才能开始,所以你被开除他们关连续给“低”,一个相当不错的开端。 另一种是线程的优先级决定谁可以当有处理器时间的参数运行。 随着两个线程,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提及。 因此,假设您正在运行的平台基本上忽略的水平,那么它可以追溯到基本stastical概率:有时某些线程似乎跑的比别人快,这取决于调度是如何工作等等。
我不认为任何人真正使用Java线程优先级的一切,因为他们的工作(或缺乏)是最好的平台依赖性。
文章来源: Testing thread priority. How come in some cases low priority threads are faster?