暂停线程执行常用的方法有 sleep()和 yield()方法,这两个方法的区别是:
- sleep()方法:可以让正在运行的线程进入阻塞状态,直到休眠时间满了,进入就绪状 态
- yield()方法:可以让正在运行的线程直接进入就绪状态,让出 CPU 的使用权。
sleep 方法的使用
package com.yqq.app12;
import lombok.SneakyThrows;
/**
* @Author yqq
* @Date 2021/11/25 23:25
* @Version 1.0
*/
public class SleepRhread implements Runnable{
public void run() {
System.out.println(Thread.currentThread().getName()+"线程开始");
for (int i = 0; i < 20; i++) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+i);
}
System.out.println(Thread.currentThread().getName()+"线程结束");
}
public static void main(String[] args) {
Thread t1 = new Thread(new SleepRhread());
t1.start();
}
}
yield 方法的使用
yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。 yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得 运行的机会。因此,使用 yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。 但是,实际中无法保证 yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次 选中。
使用 yield 方法时要注意的几点:
- yield 是一个静态的方法。
- 调用 yield 后,yield 告诉当前线程把运行机会交给具有相同优先级的线程。
- yield 不能保证,当前线程迅速从运行状态切换到就绪状态。
- yield 只能是将当前线程从运行状态转换到就绪状态,而不能是等待或者阻塞状态。
package com.yqq.app12;
/**
* @Author yqq
* @Date 2021/11/25 23:16
* @Version 1.0
*/
public class YieldThread implements Runnable{
public void run() {
for (int i = 0; i < 20; i++) {
if ("Thread-0".equals(Thread.currentThread().getName()))
if (i==0)
Thread.yield();
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new YieldThread());
Thread t2 = new Thread(new YieldThread());
t1.start();
t2.start();
}
}