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方法唤醒它。
区别比较
- 锁的释放:sleep方法不会释放锁,而wait方法会释放对象锁。
- 调用方式:sleep方法是Thread类的静态方法,可以直接调用;而wait方法必须在synchronized代码块中调用。
- 唤醒方式: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