Android中sleep和wait的区别

在Android开发中,我们经常会遇到sleep和wait这两个方法,它们都可以用来实现线程的等待,但是它们之间却有着很大的区别。本文将详细介绍sleep和wait的区别,并通过代码示例来说明它们的用法。

sleep方法

sleep方法是Thread类的一个静态方法,它可以让当前线程休眠一段时间。sleep方法的语法如下:

try {
    Thread.sleep(1000); // 休眠1秒
} catch (InterruptedException e) {
    e.printStackTrace();
}

sleep方法的参数是一个long类型的时间,单位是毫秒。当调用sleep方法时,当前线程会暂停执行,让出CPU的时间片给其他线程执行,但是当前线程的锁并不会被释放。sleep方法不会释放锁,因此其他线程无法获取当前线程的锁。

wait方法

wait方法也是Thread类的一个方法,它用来让线程等待某个条件满足。wait方法的语法如下:

synchronized (object) {
    try {
        object.wait(); // 等待条件满足
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

wait方法必须在synchronized代码块中调用,因为wait方法会释放对象锁。当调用wait方法时,当前线程会释放对象锁,并进入等待状态,直到其他线程调用notify或notifyAll方法唤醒它。

区别比较

  1. 锁的释放:sleep方法不会释放锁,而wait方法会释放对象锁。
  2. 调用方式:sleep方法是Thread类的静态方法,可以直接调用;而wait方法必须在synchronized代码块中调用。
  3. 唤醒方式:sleep方法会在指定时间后自动唤醒;而wait方法需要其他线程调用notify或notifyAll方法唤醒。

代码示例

下面是一个简单的示例,演示了sleep和wait方法的用法:

public class SleepWaitExample {
    public static void main(String[] args) {
        final Object lock = new Object();

        // sleep示例
        new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread 1 starts");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread 1 ends");
            }
        }).start();

        // wait示例
        new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread 2 starts");
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Thread 2 ends");
            }
        }).start();
    }
}

在上面的代码中,我们创建了两个线程,一个使用sleep方法,另一个使用wait方法。使用sleep方法的线程会休眠2秒后结束,而使用wait方法的线程会等待被唤醒。

总结

通过本文的介绍,我们了解了sleep和wait方法的区别:sleep方法不释放锁,wait方法释放对象锁;sleep方法可以直接调用,wait方法必须在synchronized代码块中调用;sleep方法在指定时间后自动唤醒,wait方法需要其他线程调用notify或notifyAll方法唤醒。

在实际开发中,根据具体的需求选择合适的方法,可以更好地控制线程的等待与唤醒过程。希望本文对您有所帮助,谢谢阅读!

pie
    title 线程等待方式比例
    "sleep方法" : 50
    "wait方法" : 50