Java面试题之多线程 线程的sleep()方法和yield()方法有什么区别?
在Java中,sleep()
方法和yield()
方法都是与线程调度相关的,但它们的功能和行为有显著的区别。以下是这两者的主要区别:
sleep(long millis)
: 这是一个静态方法,属于Thread
类。调用此方法的线程会暂停执行指定的时间(以毫秒为单位),在此期间它会进入“阻塞”状态。线程在睡眠结束后会被重新调度。
yield()
: 这是一个静态方法,也属于Thread
类。调用此方法的线程会提示调度器,当前线程愿意让出CPU的控制权,允许其他同优先级的线程运行。调用yield()
并不保证当前线程会立即被挂起,调度器可以选择继续执行当前线程。
sleep()
: 线程在调用sleep()
后会进入“阻塞”状态,直到指定的时间过去,或者被中断。
yield()
: 线程在调用yield()
后会进入“就绪”状态,调度器会选择其他同优先级的线程来执行,但当前线程仍然有可能被重新调度。
sleep()
: 使线程暂停执行,通常用于控制线程的执行频率或实现某种延迟。
yield()
: 允许其他线程有机会执行,通常用于优化多线程程序的性能,但并不保证其他线程会立即执行。
sleep()
: 常用于需要等待某个条件或时间的场景,例如定时任务、轮询等。
yield()
: 常用于希望提高程序的响应性或公平性,尤其是在多线程竞争资源的情况下。
public class SleepYieldExample {
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
try {
System.out.println("Thread 1 is sleeping for 2 seconds.");
Thread.sleep(2000); // 线程1睡眠2秒
System.out.println("Thread 1 woke up.");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread thread2 = new Thread(() -> {
System.out.println("Thread 2 is yielding.");
Thread.yield(); // 线程2让出CPU
System.out.println("Thread 2 is running.");
});
thread1.start();
thread2.start();
}
}
sleep()
用于让线程暂停执行一段时间,而yield()
用于让当前线程主动放弃CPU的控制权,允许其他线程执行。两者在多线程编程中有不同的应用场景和效果。