sleep 和 wait 的区别

简介: Java 中,线程的 "sleep" 和 "wait" 方法区别

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

推荐:体系化学习Java(Java面试专题)

一、sleep 和 wait 的区别

在 Java 中,线程的 "sleep" 和 "wait" 方法区别:

  1. "sleep" 方法是 Thread 类的静态方法,而 "wait" 方法是 Object 类的实例方法。

  2. "sleep" 方法会使线程进入睡眠状态,暂停执行一段时间,然后继续执行;而 "wait" 方法会使线程进入等待状态,直到其他线程调用了该对象的 "notify" 或 "notifyAll" 方法才会继续执行。

  3. "sleep" 方法不会释放线程持有的锁,而 "wait" 方法会释放线程持有的锁。

  4. "sleep" 方法通常用于在一段时间后再次执行任务,或在执行任务之前等待一段时间;而 "wait" 方法通常用于线程间的协作,比如等待其他线程的完成或等待某个条件的满足。

  5. "sleep" 方法的参数是一个时间段,而 "wait" 方法没有参数。

二、使用案例

线程 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();
        }
    }
}
目录
相关文章
|
1天前
sleep()和wait()的区别
(1)wait()是Object的方法,sleep()是Thread类的方法 (2)wait()会释放锁,sleep()不会释放锁 (3)wait()要在同步方法或者同步代码块中执行,sleep()没有限制 (4)wait()要调用notify()或notifyall()唤醒,sleep()自动唤醒
12 5
|
6月前
|
Java
在多线程中sleep()和wait()的区别(详细)
在多线程中sleep()和wait()的区别(详细)
sleep () 和 wait () 的区别
sleep () 和 wait () 的区别
86 0
|
监控
Sleep()和wait()方法的区别
Sleep()和wait()方法的区别
136 0
|
调度 C++
Thread.sleep(0) vs Thread.sleep(1) vs Thread.yield() vs Object.wait()
Thread.sleep(0) vs Thread.sleep(1) vs Thread.yield() vs Object.wait()
|
Java
java多线程中sleep和wait的4个区别,你知道几个?
sleep和wait的区别是面试中一个非常常见的问题,因为从表象来看,好像sleep和wait都能使线程处于阻塞状态,但是却有着本质上的却别。这篇文章就来好好分析一下。 整体的区别其实是有四个: 1、sleep是线程中的方法,但是wait是Object中的方法。 2、sleep方法不会释放lock,但是wait会释放,而且会加入到等待队列中。 3、sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字。 4、sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)。 下面我们就根据这四个区别来分析。
298 0
java多线程中sleep和wait的4个区别,你知道几个?
线程 - wait & sleep 区别
线程 - wait & sleep 区别
119 0
|
Java
sleep与wait区别
第一个区别是在对系统资源的占用上。 wait是Object类的一个函数(也就意味着所有对象都有这个函数),指线程处于进入等待状态,此时线程不占用任何资源,不增加时间限制。wait可以被notify和notifyAll函数唤醒(当然这两个同时也是Object的函数)。 而sleep则是Thread类的一个函数,指线程被调用时,占着CPU不工作。此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。
141 0
|
监控
sleep 与 wait 区别
sleep 与 wait 区别
114 0