博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌
Java知识图谱点击链接:体系化学习Java(Java面试专题)
💕💕 感兴趣的同学可以收藏关注下 ,不然下次找不到哟💕💕
1、sleep 和 wait 的区别
在 Java 中,线程的 “sleep” 和 “wait” 方法区别:
-
“sleep” 方法是 Thread 类的静态方法,而 “wait” 方法是 Object 类的实例方法。
-
“sleep” 方法会使线程进入睡眠状态,暂停执行一段时间,然后继续执行;而 “wait” 方法会使线程进入等待状态,直到其他线程调用了该对象的 “notify” 或 “notifyAll” 方法才会继续执行。
-
“sleep” 方法不会释放线程持有的锁,而 “wait” 方法会释放线程持有的锁。
-
“sleep” 方法通常用于在一段时间后再次执行任务,或在执行任务之前等待一段时间;而 “wait” 方法通常用于线程间的协作,比如等待其他线程的完成或等待某个条件的满足。
-
“sleep” 方法的参数是一个时间段,而 “wait” 方法没有参数。
2、sleep 和 wait 的应用场景
sleep 和 wait 是两个在编程中常用的方法,它们的应用场景如下:
sleep 方法是线程类的一个静态方法,用于使线程暂停执行一段时间。主要应用场景包括:
-
实现简单的延时操作:可以使用 sleep 方法来实现简单的延时操作,例如在某个任务执行完毕后等待一段时间再执行下一个任务。
-
模拟并发情况:在多线程编程中,可以使用 sleep 方法来模拟并发情况,让线程暂停一段时间后再继续执行,以便观察多线程之间的交替执行。
-
控制程序执行速度:在某些情况下,为了控制程序的执行速度,可以使用 sleep 方法来降低线程的执行速度,以避免资源过度消耗。
wait 方法是 Object 类的一个实例方法,用于在多线程环境下进行线程间的通信和协调。主要应用场景包括:
-
实现线程间的等待和唤醒机制:可以使用 wait 方法来实现线程间的等待和唤醒机制,一个线程调用了对象的 wait 方法后会进入等待状态,直到其他线程调用了相同对象的 notify 或 notifyAll 方法来唤醒它。
-
实现生产者-消费者模式:在生产者-消费者模式中,消费者线程在没有数据可消费时需要等待,生产者线程在生产数据后需要通知消费者线程。这时可以使用 wait 和 notify/notifyAll 方法来实现线程间的协调和通信。
-
实现线程间的顺序执行:有时需要确保多个线程按照特定的顺序执行,可以使用 wait 和 notify/notifyAll 方法来实现线程间的顺序执行,通过等待和唤醒机制来控制线程的执行顺序。
总的来说,sleep 方法主要用于控制线程的执行时间和速度,而 wait 方法主要用于线程间的通信和协调。根据具体的需求和场景,选择合适的方法来实现所需的功能。
3、使用案例
线程 1 调用了 “sleep” 方法,暂停执行了一秒钟,然后继续执行。线程 2 调用了 “wait” 方法,进入等待状态,直到主线程调用了 lock.notify() 方法,才会继续执行。
注意,线程 2 在调用 “wait” 方法之前必须先获取 lock 对象的锁,否则会抛出 IllegalMonitorStateException 异常。
package com.pany.camp.thread;
public class SleepWait {
public static void main(String[] args) {
final Object lock = new Object();
// 创建一个线程,调用 sleep 方法
Thread thread1 = new Thread(() -> {
System.out.println("Thread 1 started.");
try {
Thread.sleep(1000); // 线程睡眠 1 秒
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 finished.");
});
// 创建一个线程,调用 wait 方法
Thread thread2 = new Thread(() -> {
System.out.println("Thread 2 started.");
synchronized (lock) {
try {
lock.wait(); // 线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Thread 2 finished.");
});
// 启动线程
thread1.start();
thread2.start();
// 等待一段时间
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 唤醒线程 2
synchronized (lock) {
lock.notify();
}
}
}
💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊文章来源:https://www.toymoban.com/news/detail-474587.html
文章来源地址https://www.toymoban.com/news/detail-474587.html
到了这里,关于sleep 和 wait 的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!