gpt4 book ai didi

java - 了解java线程中的 "priority"

转载 作者:搜寻专家 更新时间:2023-11-01 02:13:59 26 4
gpt4 key购买 nike

我是 java 和线程世界的新手..我只是在看下面的示例代码:-

package com.alice.learnthread;

class NewThread implements Runnable{
Thread t;
long clicker=0;

private volatile boolean running=true;
NewThread(int p){
t=new Thread(this);
t.setPriority(p);
}
public void run(){
while(running){
clicker++;
}
}
public void stop(){
running=false;
}
public void start(){
t.start();
}

 public class TestThread {
public static void main(String[] args){
Thread r=Thread.currentThread();
r.setPriority(Thread.MAX_PRIORITY);
NewThread hi=new NewThread(Thread.NORM_PRIORITY+2);
NewThread lo=new NewThread(Thread.NORM_PRIORITY-2);
hi.start();
lo.start();
try{
r.sleep(5000);
}catch(InterruptedException e){
System.out.println("caught");
}
hi.stop();
lo.stop();
try{
hi.t.join();
lo.t.join();
}catch(InterruptedException e){
System.out.println("cau1");
}
System.out.println("hi = "+hi.clicker+" lo="+lo.clicker);
}

然而,根据书中的输出,具有高优先级的线程对于变量 clicker 应该具有更高的值。但在我的例子中,低优先级线程的变量 clicker 的值比高优先级线程的高得多。对我来说,输出如下所示:-

hi = 2198713135 lo=2484053552

这是否意味着优先级较低的线程比优先级较高的线程获得更多的 CPU 时间...我是否遗漏了什么...结果在 ubuntu 和 win7 上是相同的(较低优先级线程的点击器值较高)。 ..

最佳答案

正如 sul 所说,优先级与其说是 JVM 的契约,不如说是一种暗示。在您的情况下,您的结果可以用多种理论来解释:

  • 第二个线程运行得更快,因为它利用了第一个线程的编译优势,并在第一个线程之后停止。
  • while 循环检查 volatile 变量的值会强制 jvm 实现该值,在此期间可以将 CPU 交给其他线程。
  • 停止方法需要很多时间来停止线程。

这只是一些事实,说明线程的行为是不可预测的。例如,尝试先启动低优先级线程,我相信您会得到不同的结果。

另外,试试这个:

public class TestThread
{
public static void main(String[] args){
Thread r=Thread.currentThread();
r.setPriority(Thread.MAX_PRIORITY);
NewThread hi=new NewThread(Thread.MAX_PRIORITY);
NewThread lo=new NewThread(Thread.MIN_PRIORITY);
hi.start();
lo.start();
try{
r.sleep(5000);
}catch(InterruptedException e){
System.out.println("caught");
}
hi.interrupt();
lo.interrupt();

System.out.println("hi="+hi.clicker);
System.out.println("lo="+lo.clicker);
}
}
class NewThread extends Thread{
long clicker=0;

NewThread(int p){
setPriority(p);
}
public void run(){
while(true){
clicker++;
}
}
}

我确信删除 volatile 变量并更改线程的停止方式会给您带来其他结果。

关于java - 了解java线程中的 "priority",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10792840/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com