理解java线程中的“优先级”

2023-12-27

我是 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);
}

}

然而,根据书中的输出,具有高优先级的线程对于变量点击器应该具有更高的价值。但就我而言,较低优先级线程的变量点击器的值比较高优先级线程的值高得多。对我来说,输出如下:-

hi = 2198713135 lo=2484053552

这是否意味着较低优先级的线程比较高优先级的线程获得更多的CPU时间...我是否错过了一些东西..结果在ubuntu和win7上是相同的(较低优先级线程的点击器值较高)...


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

  • 第二个线程运行得更快,因为它利用了第一个线程的编译优势,并在第一个线程之后停止。
  • 事实上,while 循环检查易失性变量的值,迫使 jvm 实现该值,并在此期间可以为其他线程提供 CPU。
  • stop 方法需要花费大量时间来停止线程。

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

另外,试试这个:

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++;
        }
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解java线程中的“优先级” 的相关文章

随机推荐

  • 嘿,如何从 laravel 中的 klaviyo php-sdk 收集 laravel 中的短信同意

    嘿伙计们 有谁知道如何在 klaviyo 中添加短信内容吗 laravel 中的这个包 https github com klaviyo php klaviyo or just add a property to someone 基本上 我
  • 什么时候应该在 Material-UI 中使用 Typography?

    我正在使用 Material UI 但我有点困惑 有这个组件Typography https material ui com components typography typography但我真的不明白何时使用它以及它的目的是什么 什么时
  • 禁用 ScrollView 中包含的 ListView 的滚动

    我想为我的用户显示个人资料屏幕 它必须具有三个视图 2Buttons and a ImageView and a ListView显示该用户制作的内容 但是 我不想要ListView滚动 相反 我希望它尽可能大 并将我所有的观点放在一个Sc
  • 大写 utf8 字符与其小写变体的字节数始终相同吗?

    显然对于拉丁字母来说也是如此 但我是从概念意义上跨语言和 Unicode 规范来问这个问题的 实际上 这是为了比较两个字符串而出现的 如果您已经知道它们在所有语言中的字节数不同 您是否可以认为足以保证它们不是同一字符串的不同 大小写 版本
  • Android IME,在EditText中设置光标位置

    我正在使用软键盘 需要在 IME 编辑文本中设置光标位置 如上图所示 我创建了软键盘 我们可以看到在编辑文本和当前光标位置 由蓝色指示器显示 中输入了一些文本 我需要将光标位置设置在当前行的末尾 在我们的例子中 在图像中首先以红色显示的行的
  • 如何在 Ruby 应用程序中找到未使用的方法?

    我有一个 Ruby 应用程序 其中有很多类 模块 其中一些未使用 有没有一种简单的方法可以找出哪个 我正在考虑做一个配置文件 然后使用它的输出 还有其他想法吗 像 rcov 这样的覆盖工具可能会有所帮助 https github com r
  • 如何在二维图像中的不规则形状上应用纹理?

    我正在尝试从 UIColor 图案图像在 CALayer 上应用纹理 纹理正在应用 但未正确透视转换 看起来我的绘图逻辑存在问题 即我需要使用纹理图像并将其映射到不规则形状 我做了一些研究 发现这件事可以通过 OpenGL 或 Metal
  • TypeORM 选择不区分大小写的不同

    我正在尝试创建一个连接到 postgresql 数据库的 TypeORM 查询生成器以获取数据库中的所有唯一名称 我的查询看起来像这样 names await this context manager getRepository Names
  • 如何在text2vec中对齐两个GloVe模型?

    假设我已经训练了两个独立的 GloVe 向量空间模型 使用text2vec in R 基于两个不同的语料库 这样做可能有不同的原因 例如 两个基础语料库可能来自两个不同的时间段 或者两个非常不同的流派 我有兴趣比较这两个语料库之间单词的用法
  • 删除名称与模式匹配的多个数据库

    我想删除所有以单词开头的数据库 abc xyz cms db1 cms db2 cms xyz pqr 在上面给出的示例中 我想删除所有以 cms 一词开头的数据库 我想 maatkit 或 shell 脚本可以做到这一点 最好的方法是什么
  • 当 SOAP 正文包含 UTF-8 BOM 时出现 JAX-WS 错误

    我使用部署在 WebLogic 10 3 上的 JAX WS v2 1 3 Sun JDK 1 6 0 05 开发了一个 Web 服务 当我使用 Java 客户端或 SoapUI 或其他 Web 服务测试工具时 该服务运行良好 我需要使用
  • 为什么 BigQuery 不显示 Firebase-Analytics 数据?

    我正在使用 BlazePlan 并将我的 firebase 分析帐户与 BigQuery 相关联 尽管已经过去两天多了 我仍然无法在 BigQuery 中看到分析数据 有 Firebase crashlytics firebase mess
  • 如何在 blazor navigator 中将复杂对象作为参数传递

    当尝试传递复杂对象作为参数时 它只传递对象的类型名 导航到不同的组件 页面时传入复杂对象的选项有哪些 这就是我尝试过的 page showLocation SelectedOrgLocation 正在发送信息的页面 navManager N
  • 如何在Kubernetes集群中创建用户?

    我正在尝试在 Kubernetes 集群中创建用户 我使用我的 Terraform 脚本在 DigitalOcean 上旋转了 2 个水滴 然后我使用登录主节点 Dropletssh doctl compute ssh droplet1 接
  • 多处理池的意外行为

    在下面的代码中 我期望输出为 2 因为我在将函数分配给多处理池之前更改了 config 的值 但我得到的是 5 我确信这是有充分理由的 但不知道如何解释 from multiprocessing import Pool config 5 c
  • 更改动态任务中自动生成的任务名称

    我正在尝试创建一个动态工作流程 但想要更改气流自动生成的任务名称并将其分配给列表中的任务 我尝试访问上下文并手动更改taskid但这在 UI 中的管道渲染期间也不起作用 My Code def get the route router ip
  • 如何从 emf 模型生成“带注释的 java 代码”

    更准确地说 我想知道如何将注释建模到 core 模型定义中 这样生成的 java 代码就会包含它们 例如 hibernate 持久性标签 EMF 论坛上的这篇文章讨论了如何使用自定义模板来生成代码 https www eclipse org
  • 如何使用新的 YouTube iframe 样式代码嵌入高质量视频

    我正在使用 youtubes 新的 iframe 代码来嵌入视频 但视频的质量似乎比我在 youtube 上观看的质量要低 有没有办法嵌入高质量的视频 我现在的代码是 vq hd720 或 vq hd1080 解决了其他方法都失败的问题
  • 导入错误:libcublas.so.10.0:无法打开共享对象文件:没有这样的文件或目录

    我已经在 Ubuntu 18 04 上安装了 Cuda 10 1 和 cudnn 它似乎已正确安装为 nvcc 和 nvidia smi 类型 我得到了正确的响应 user nvcc V nvcc NVIDIA R Cuda compile
  • 理解java线程中的“优先级”

    我是 java 和线程世界的新手 我刚刚浏览了如下示例代码 package com alice learnthread class NewThread implements Runnable Thread t long clicker 0