Java 线程sleep和wait区别
在Java中,有两种主要的方式来控制线程的暂停:通过Thread类的sleep()方法和通过线程对象的wait()方法。
sleep()
方法:
Thread.sleep()
是Thread类的一个静态方法,用于使当前正在执行的线程暂停指定的时间。- 调用
Thread.sleep()
方法会导致当前线程进入阻塞状态,释放CPU资源,但不会释放锁。 sleep()
方法抛出InterruptedException异常,需要进行异常处理。sleep()
方法参数为毫秒数,可以精确控制线程的暂停时间。
wait()
方法:
wait()
方法是Object类的实例方法,用于使当前线程进入等待状态,直到其他线程调用相同对象上的notify()
或notifyAll()
方法唤醒该线程。- 调用
wait()
方法会导致当前线程释放对应对象的锁,并进入等待队列中等待被唤醒。 - 在调用
wait()
方法之前,必须先获得对象的锁,否则会抛出IllegalMonitorStateException异常。 wait()
方法必须在synchronized代码块内或方法内调用,因为它依赖于锁机制。
综上所述,sleep()
方法用于暂停当前线程一段时间,而wait()
方法用于等待其他线程通知并唤醒。sleep()
不会释放锁,而wait()
会释放锁并进入等待队列。另外,wait()
方法需要在synchronized块中调用,而sleep()
方法则不需要。