下面我将为大家详细讲解"详解Java中wait和sleep的区别"的完整攻略。
什么是wait和sleep?
在Java中,wait和sleep都是线程等待的方法。它们的作用都是让程序进入等待状态,但是两者还是有一些区别的。
wait和sleep的区别
- wait是Object类的方法,而sleep是Thread类的方法。
- 在调用wait的时候,线程会释放它所持有的锁并且进入等待状态,直到其他线程调用notify或者notifyAll方法,才能唤醒这个线程。而sleep会使当前线程进入阻塞状态,但不会释放它所持有的锁。
示例说明
下面分别给大家举两个例子说明一下wait和sleep的区别。
示例1:wait和notify的使用
public class WaitAndNotifyDemo {
public static void main(String[] args) {
final Object lock = new Object();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + "执行了wait方法");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "被唤醒了");
}
}
}, "线程1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println(Thread.currentThread().getName() + "执行了notify方法");
lock.notify();
}
}
}, "线程2");
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
}
在上面的代码中,我们创建了一个共享锁lock,两个线程t1和t2共享这把锁。t1线程获取到锁之后,执行了wait方法以后,会释放这把锁,进入等待状态,直到t2线程调用notify方法将它唤醒。
示例2:sleep的使用
public class SleepDemo {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + "开始执行");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行结束");
}
}
在上面的代码中,我们让主线程执行了sleep方法,这时主线程会进入阻塞状态,但不会释放它所持有的锁,3秒后再次执行后面的代码。
通过以上的示例可以很清楚地看到wait和sleep的区别。希望本篇攻略能对大家了解wait和sleep的区别有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java中wait和sleep的区别 - Python技术站