下面详细讲解Java线程中sleep和wait的区别。
sleep和wait的区别
等待方式不同
sleep()
方法是线程的静态方法,通过该方法可以使当前线程暂停指定的时间,但不会释放已经持有的锁。wait()
方法是Object类中的方法,通过该方法可以使线程等待其它线程通知其被唤醒,同时会释放当前持有的锁。
调用位置不同
sleep()
方法可以在任何位置调用,而wait()
方法只能在同步块或同步方法中调用。
需要监视器的不同
wait()
方法需要在同步块或同步方法中,等待期间依然需要持有监视器,一般在调用wait()
前先调用synchronized()
方法获取该对象的锁。而sleep()
方法不需要持有监视器。
触发操作不同
wait()
方法通常通过notify()
或notifyAll()
方法来唤醒该线程,notify()
可以唤醒一个等待的线程,notifyAll()
可以唤醒所有等待的线程。而sleep()
方法会在指定时间后自动唤醒,或者被中断时也会被唤醒。
示例一
public class SleepTest {
public static void main(String[] args) throws InterruptedException {
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread A is running...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread A is done.");
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Thread B is running...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread B is done.");
}
});
threadA.start();
threadB.start();
}
}
输出结果为:
Thread A is running...
Thread B is running...
Thread B is done.
Thread A is done.
其中,线程A执行了sleep()
方法,让自己休眠3秒钟,线程B执行了sleep()
方法,让自己休眠1秒钟。由于sleep()
方法不会释放锁,所以线程A和B都开始执行,后者先执行完成,然后是线程A。
示例二
public class WaitTest {
public static void main(String[] args) {
final Object lock = new Object();
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println("Thread A is running...");
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread A is done.");
}
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
System.out.println("Thread B is running...");
lock.notify();
System.out.println("Thread B is done.");
}
}
});
threadA.start();
threadB.start();
}
}
输出结果为:
Thread A is running...
Thread B is running...
Thread B is done.
Thread A is done.
线程A占有了共享对象lock的监视器,进入同步块后进入等待状态,直到接收到notify()
信号,被唤醒继续执行。线程B在获得了监视器之后向所有等待的线程发送通知,唤醒了线程A后执行完毕。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程中sleep和wait的区别详细介绍 - Python技术站