说明
- 调用yield会让当前线程从Running进入Runnable就绪状态,然后调度执行其他线程
- 具体的实现依赖于操作系统的任务调度器
线程优先级
现成优先级会提示调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它
如果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值更大