说明

  1. 调用yield会让当前线程从Running进入Runnable就绪状态,然后调度执行其他线程
  2. 具体的实现依赖于操作系统的任务调度器

线程优先级

现成优先级会提示调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它

如果cpu比较忙,那么优先级高的线程会获得更多的时间片,但cpu闲时,优先级几乎没作用。

验证

接下来我们验证一下yield

package cn.meowrain;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Main {
    public static void main(String[] args) throws InterruptedException {
        Runnable r1 = () -> {
            int count = 0;
            for(;;) {
                System.out.println("-->1:" + count++);
            }
        };
        Runnable r2 = ()->{
            int count = 0;
            for(;;) {
//                Thread.yield();
                System.out.println("\t\t-->2:" + count++);
            }
        };
        Thread t1 = new Thread(r1,"t1");
        Thread t2 = new Thread(r2,"t2");
        t1.start();
        t2.start();
    }
}

上面的代码没有让t2线程礼让t1,我们来看看结果

可以看到t1和t2的值是差不多大的,说明两个线程是同时执行的,没有把更多时间片让给t1线程

package cn.meowrain;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Main {
    public static void main(String[] args) throws InterruptedException {
        Runnable r1 = () -> {
            int count = 0;
            for(;;) {
                System.out.println("-->1:" + count++);
            }
        };
        Runnable r2 = ()->{
            int count = 0;
            for(;;) {
                Thread.yield();
                System.out.println("\t\t-->2:" + count++);
            }
        };
        Thread t1 = new Thread(r1,"t1");
        Thread t2 = new Thread(r2,"t2");
        t1.start();
        t2.start();
    }
}

这段代码让t1礼让t1,我们再来看看结果‘’

可以看到t1都7万多了,t2才3万多,这说明更多的cpu时间片给了t1

验证优先级

优先级有上面三种,默认为5

package cn.meowrain;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

@Slf4j
public class Main {
    public static void main(String[] args) throws InterruptedException {
        Runnable r1 = () -> {
            int count = 0;
            for(;;) {
                System.out.println("-->1:" + count++);
            }
        };
        Runnable r2 = ()->{
            int count = 0;
            for(;;) {
                System.out.println("\t\t-->2:" + count++);
            }
        };
        Thread t1 = new Thread(r1,"t1");
        Thread t2 = new Thread(r2,"t2");
        t1.setPriority(Thread.MIN_PRIORITY);
        t1.start();
        t2.start();

    }
}

可以看到,线程t2的优先级更高,count值更大