sleep()与wait():探究暂停与等待的差异

5,477次阅读
没有评论

共计 1741 个字符,预计需要花费 5 分钟才能阅读完成。

风里有诗句
2024-03-11 11:07:06
浏览数 (1119)

在 Java 多线程编程中,了解如何控制线程的暂停和等待是至关重要的。Java 提供了 sleep() 方法和 wait() 方法来满足这些需求。然而,这两种方法具有不同的行为和用途。本文将分别介绍 Java 中的 sleep() 方法和 wait() 方法,并对比它们在实现线程控制方面的差异。

Java-logo

sleep() 方法

sleep() 方法是 Thread 类的静态方法,用于暂停当前线程的执行一段时间。它接受一个时间参数,使线程进入阻塞状态,暂停执行指定的时间。sleep() 方法被广泛用于实现定时任务、模拟延迟等场景。

使用示例

public class SleepExample {public static void main(String[] args) {System.out.println("Start of the program");
        
        // 暂停当前线程执行 2 秒钟
        try {Thread.sleep(2000);
        } catch (InterruptedException e) {e.printStackTrace();
        }
        
        System.out.println("End of the program");
    }
}

wait() 方法

wait() 方法是 Object 类的方法,用于使当前线程进入等待状态,并释放它所持有的锁。当线程调用 wait() 方法时,它会释放锁,并等待其他线程通过 notify() 或 notifyAll() 方法来唤醒它。wait() 方法常用于线程间的协调和通信。

使用示例

public class WaitExample {public static void main(String[] args) {final Object lock = new Object();
        
        Thread thread1 = new Thread(() -> {synchronized (lock) {System.out.println("Thread 1 acquired lock and waiting");
                try {
                    // 线程 1 等待,释放锁
                    lock.wait();} catch (InterruptedException e) {e.printStackTrace();
                }
                System.out.println("Thread 1 resumed execution");
            }
        });
        
        Thread thread2 = new Thread(() -> {synchronized (lock) {System.out.println("Thread 2 acquired lock and notifying");
                // 唤醒等待的线程
                lock.notify();}
        });
        
        thread1.start();
        thread2.start();}
}

二者差异对比

下面对 sleep() 方法和 wait() 方法进行对比,重点关注它们的作用、行为和适用场景。

作用和用途
  • sleep() 方法的主要作用是暂停当前线程的执行,提供一种简单的方式来控制线程的暂停时间。
  • wait() 方法的主要作用是使当前线程进入等待状态,并释放它所持有的锁,实现线程间的协调和通信。
行为和效果
  • sleep() 方法在执行期间不会释放锁,线程会一直保持对锁的持有。
  • wait() 方法在执行时会释放锁,允许其他线程获取该对象的锁并执行相应的同步代码。
适用场景
  • sleep() 方法适用于需要让线程暂停执行一段时间的情况,例如实现定时任务、模拟延迟等。
  • wait() 方法适用于线程间的协调和通信,只能在同步代码块或同步方法中使用,依赖于对象的锁。
唤醒机制
  • sleep() 方法不需要特定的唤醒机制,线程会在指定的时间过后自动苏醒并继续执行。
  • wait() 方法需要通过 notify() 或 notifyAll() 方法来唤醒等待的线程,否则线程会一直等待,直到被中断或等待超时。

总结

sleep() 方法和 wait() 方法在 Java 多线程编程中具有不同的作用和行为。sleep() 方法用于暂停线程的执行一段时间,不释放锁,适用于控制线程的暂停时间。wait() 方法用于线程间的协调和通信,释放锁并等待唤醒,适用于实现线程间的等待与通知机制。开发者应根据具体需求和场景选择合适的方法,以实现所需的线程控制和同步效果。

原文地址: sleep() 与 wait():探究暂停与等待的差异

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-19发表,共计1741字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)