多线程之(线程的优先级与让步)

2020-07-04  本文已影响0人  新征程Dream

这两个玩意比较玄,以理解为主。

线程的优先级

设置线程的优先级的参数越大,优先级越高。

我们应该知道,线程只有抢到CPU执行权,才会被执行。我们可以人为的提高某个线程的优先级,让他抢到CPU执行权的几率大一点。但是,抢到CPU的记录率大,但并不代表每次都能抢到CPU的执行权,这一点我们应该明确。比如,某个公司在举行年度聚会的抽奖环节,老板的小舅子也参与其中,于是抵不过老板娘的压力,偷偷给小舅子两张抽奖券,让小舅子的获奖记录大一点,但不代表小舅子能一定获奖。
回到代码层面

package cn.zl.ThreadTest;
public class ThreadDemo1 {
    public static void main(String[] args) {
        // 创建线程A
        Thread threadA = new Thread(new ThreadA());
        Thread threadB = new Thread(new ThreadB());
        // 设置优先级
        // Thread.MAX_PRIORITY 值为:10;
        // Thread.MIN_PRIORITY 值为:1;
        // Thread.NORM_PRIORITY 值为:5;
        threadA.setPriority(Thread.MAX_PRIORITY);
        threadA.setPriority(Thread.MIN_PRIORITY);
        // 线程跑起来
        threadA.start();
        threadB.start();
    }
}
// 搞两个线程
class ThreadA implements Runnable{
    private int num = 1000;
    public void run() {
        while (num>0){
            System.out.println("线程A"+" "+num);
            num--;
        }
    }
}
class ThreadB implements Runnable{
    private int num = 1000;
    public void run() {
        while (num>0){
            System.out.println("线程B"+" "+num);
            num--;
        }
    }
}

你可以测试100次,统计一下,线程A和线程B的先执行完的次数。
获取线程的优先级

// 获取线程的优先级
        int priorityA = threadA.getPriority();
        int priorityB = threadB.getPriority();
        System.out.println(priorityA);
        System.out.println(priorityB);

线程让步

线程让步就是调用线程的yield() 方法,它可以让当前的线程由"运行状态"进入"就绪状态",也就说让抢占到CPU执行权的线程,让出线程的执行权,大家再来抢。例如:还拿公司的年会抽奖,老板也获得一票,于是老板为了展现自己的大度,就放弃本地抽奖的机会。并不代表,明年的年会抽奖老板,不会获奖。大概就是这么个意思。
回到代码层面

package cn.zl.ThreadTest;
public class ThreadDemo1 {
    public static void main(String[] args) {
        // 创建线程A
        Thread threadA = new Thread(new ThreadA());
        Thread threadB = new Thread(new ThreadB());
        // 线程跑起来
        threadA.start();
        threadB.start();
    }
}

// 搞两个线程
class ThreadA implements Runnable{
    private int num = 1000;
    public void run() {
        while (num>0){
            // 当num值为100的时候,让出线程A的执行权。
            if (num==100){
                Thread.yield();
            }
            System.out.println("线程A"+" "+num);
            num--;
        }
    }
}

class ThreadB implements Runnable{
    private int num = 1000;
    public void run() {
        while (num>0){
            System.out.println("线程B"+" "+num);
            num--;
        }
    }
}

当前,肯定也存在线程A在num=100 的时候,让出了执行权,但是又抢到了。也可以多测试几次,现象可能会更加的明显。

上一篇 下一篇

猜你喜欢

热点阅读