《Java多线程编程核心技术(第2版)》 —1.14.2 优先级的规律性

举报
华章计算机 发表于 2020/02/08 15:40:04 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.14.2节,作者是高洪岩。

1.14.2 优先级的规律性

虽然使用setPriority()方法可以设置线程的优先级,但还没有看到设置优先级所带来的效果。

创建名称为t19的项目,文件MyThread1.java代码如下:

package extthread;

 

import java.util.Random;

 

public class MyThread1 extends Thread {

    @Override

    public void run() {

        long beginTime = System.currentTimeMillis();

        long addResult = 0;

        for (int j = 0; j < 10; j++) {

            for (int i = 0; i < 50000; i++) {

                Random random = new Random();

                random.nextInt();

                addResult = addResult + i;

            }

        }

        long endTime = System.currentTimeMillis();

        System.out.println("★★★★★thread 1 use time=" + (endTime - beginTime));

    }

}

文件MyThread2.java代码如下:

package extthread;

 

import java.util.Random;

 

public class MyThread2 extends Thread {

    @Override

    public void run() {

        long beginTime = System.currentTimeMillis();

        long addResult = 0;

        for (int j = 0; j < 10; j++) {

            for (int i = 0; i < 50000; i++) {

                Random random = new Random();

                random.nextInt();

                addResult = addResult + i;

            }

        }

        long endTime = System.currentTimeMillis();

        System.out.println("☆☆☆☆☆thread 2 use time=" + (endTime - beginTime));

    }

}

文件Run.java代码如下:

package test;

 

import extthread.MyThread1;

import extthread.MyThread2;

 

public class Run {

    public static void main(String[] args) {

        for (int i = 0; i < 5; i++) {

            MyThread1 thread1 = new MyThread1();

            thread1.setPriority(10);

            thread1.start();

 

            MyThread2 thread2 = new MyThread2();

            thread2.setPriority(1);

            thread2.start();

        }

    }

}

文件Run.java运行3次后的输出结果如图1-64所示。

 image.png

图1-64 高优先级的线程总是先执行完

从图1-64中可以发现,高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完。另外,并不是MyThread1线程先被main线程调用就先执行完,出现这种结果是因为MyThread1线程的优先级是最高级别10。当线程优先级的等级差距很大时,谁先执行完和代码的调用顺序无关,为了验证这个结论,修改Run.java代码,如下所示:

public class Run {

    public static void main(String[] args) {

        for (int i = 0; i < 5; i++) {

            MyThread1 thread1 = new MyThread1();

            thread1.setPriority(1);

            thread1.start();

 

            MyThread2 thread2 = new MyThread2();

            thread2.setPriority(10);

            thread2.start();

        }

    }

}

文件Run.java运行3次后的输出结果如图1-65所示。

 image.png

图1-65 大部分thread2先执行完

从图1-65中可以发现,大部分thread2先执行完,这就验证线程的优先级与代码执行顺序无关,出现这种结果是因为MyThread2的优先级是最高的,说明线程的优先级具有一定的规律性,即CPU尽量将执行资源让给优先级比较高的线程。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。