java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java sleep()和yield()

java中线程的sleep()方法和yield()方法的区别

作者:Flying_Fish_Xuan

本文主要介绍了java中线程的sleep()方法和yield()方法的区别,Thread类的sleep()方法使线程休眠指定时间,不释放锁,而yield()提示调度器当前线程愿意让出CPU资源,不保证立即切换线程,感兴趣的可以了解一下

1. sleep()方法

1.1 sleep()方法的定义

sleep()方法是Thread类的一个静态方法,用于使当前线程进入休眠状态(阻塞状态)一段指定的时间。在此期间,线程会暂停执行并让出CPU资源给其他线程。休眠时间结束后,线程会自动从休眠状态恢复到可运行状态(Runnable),等待操作系统重新调度。

sleep()方法有两个重载版本:

public static void sleep(long millis) throws InterruptedException;
public static void sleep(long millis, int nanos) throws InterruptedException;

1.2 sleep()方法的工作原理

当线程调用Thread.sleep()时,当前线程会进入阻塞状态,释放CPU资源,其他线程可以利用这个时间片执行。sleep()方法不会释放锁或监视器,即如果线程在同步块或方法内调用sleep(),它仍然持有锁。

sleep()方法可以抛出InterruptedException,这意味着如果线程在休眠期间被中断,sleep()会抛出此异常。因此,调用sleep()时通常需要处理这个异常。

1.3 sleep()方法的应用场景

1.4 sleep()方法的示例

public class SleepExample {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println("Thread is going to sleep...");
            try {
                Thread.sleep(2000);  // 线程休眠2秒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread is awake!");
        });

        thread.start();
    }
}

在这个示例中,线程在启动后进入休眠状态2秒钟,然后继续执行剩余的代码。

2. yield()方法

2.1 yield()方法的定义

yield()方法是Thread类的另一个静态方法,用于提示线程调度器当前线程愿意让出CPU资源,以便让其他同优先级或更高优先级的线程获得执行机会。yield()方法的调用并不保证当前线程会立刻让出CPU资源,也不保证其他线程会获得执行机会,这完全取决于线程调度器的实现和当前的系统负载。

public static native void yield();

2.2 yield()方法的工作原理

当线程调用Thread.yield()时,线程调度器会检查是否有其他同优先级或更高优先级的线程处于可运行状态(Runnable)。如果有,它们将获得执行机会;如果没有,当前线程可能继续运行。因此,yield()的作用类似于告诉调度器:“我现在已经完成了一些工作,你可以选择让其他线程执行。”

yield()方法不会阻塞线程,线程仅仅是从“运行状态”(Running)进入“可运行状态”(Runnable),以便让其他线程有机会运行。

2.3 yield()方法的应用场景

2.4 yield()方法的示例

public class YieldExample {
    public static void main(String[] args) {
        Runnable task1 = () -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Task 1 - " + i);
                Thread.yield();  // 提示调度器让出CPU
            }
        };

        Runnable task2 = () -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Task 2 - " + i);
                Thread.yield();  // 提示调度器让出CPU
            }
        };

        Thread thread1 = new Thread(task1);
        Thread thread2 = new Thread(task2);

        thread1.start();
        thread2.start();
    }
}

在这个示例中,两个线程交替运行,每个线程在完成一次循环后调用yield(),提示调度器将CPU时间分配给其他线程。

3. sleep()和 yield()的区别

3.1 目的不同

3.2 行为不同

3.3 对线程状态的影响

3.4 是否释放锁

3.5 抛出异常的情况

3.6 实际使用效果

4. sleep()和 yield()的应用场景总结

4.1 sleep()的应用场景

的延迟执行,以便验证程序的行为。

4.2 yield()的应用场景

5. 结束语

sleep()yield()是Java多线程编程中的两个重要方法,尽管它们都可以控制线程的执行顺序和时间,但它们的作用和应用场景有显著的区别。sleep()用于明确的时间控制,让线程进入休眠状态,并让出CPU资源;而yield()用于提示调度器当前线程愿意让出CPU,但不保证会让出。

在实际开发中,合理使用sleep()yield(),可以有效地控制线程的执行顺序,优化并发程序的性能,避免不必要的资源竞争。

到此这篇关于java中线程的sleep()方法和yield()方法的区别的文章就介绍到这了,更多相关java sleep()和yield()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文