在JAVA学习中,很多人认为sleep和wait混淆在一起,等待线程。 这里主要介绍这两个人是什么,以及理解它们的区别和相似之处。
一般差异
简言之,wait ) )是线程同步的实例方法。 在java.lang.Object中定义,因此可以调用任何对象。 但是,前提是在同步代码块中调用该对象,并解除该对象的锁定,以便另一个线程可以跳转并获取锁定。 另一方面,Thread.sleep ) )是可以从任何上下文中调用的静态方法。 Thread.sleep ()暂停当前线程,且不解锁。
主要区别
sleep ) )线程控制自己的进程。 wit ) )用于线程间通信,使具有对象锁的线程等待指定时间或通告)。
wait ) )释放锁定和监视器,sleep ) )不释放锁定、监视器等。 wit )用于线程间通信,sleep )用于在运行时部署暂停
适用的领域。 wait只有放在同步语句块中才有意义。
注意事项
wait会代替sleep吗?
否,直接调用wait将抛出Java.lang.illegalmonitorstateexception异常。 这是因为尚未获取对象锁定,因此无法解除锁定。
怎么获得锁?
执行对象的同步实例方法。
执行对象感知类的同步静态方法。
运行同步代码块,该代码块已将同步添加到对象中。
示威游行
Thread.sleep
静态语音方法1 (
同步(锁定) {
try {
system.out.println (' [ ' thread.current thread ] ].getname (' ) begin sleep . ' );
thread.sleep(5_000;
system.out.println (' [ ' thread.current thread ) getName ) ' ] end sleep . ' );
} catch (互联互通) )
e .打印堆栈跟踪(;
}
}
}
publicstaticvoidmain (字符串[ ] args ) {
stream.of(T1 ),T2 ).Foreach ) name-newthread ) differenceofwaitandsleep : method 1,name ) (.start )
}
运行此示例总共需要10S。 T1线程获得锁定后,暂停执行。 此时,LOCK保留在T1线程中,并获取到T2线程中
[T1] begin sleep .
[T1] end sleep .
[T2] begin sleep .
[T2] end sleep .
Object.wait
静态语音方法2 (
同步(锁定) {
try {
system.out.println (' [ ' thread.current thread ().getName ) ' ] begin wait . ' );
LOCK.wait (;
system.out.println (([ ' thread.current thread ) ) ] end wait );
} catch (互联互通) )
e .打印堆栈跟踪(;
}
}
}
publicstaticvoidmain (字符串[ ] args ) {
stream.of () T1 ),T2 ).Foreach ) name-newthread ) differenceofwaitandsleep 33603360 method 2,name ) (.start ) )
}
运行此示例时,将立即输出T1/T2 begin wait .但不输出T1/T2 end wait . 这是因为没有线程调用LOCK.notify/notifyAll进行唤醒
[T1] begin wait .
[T2] begin wait .
结论
调用:
wit ) ) :对象调用,当前线程必须与具有锁定的对象同步。
sleep ) ) :线程调用,始终执行的当前线程
同步:
wait ) ) :同步多个线程同时访问一个对象
sleep () :多个线程同步等待线程休眠
洛克:
wait ) ) :将有机会解锁并由其他线程执行
sleep ) ) :持有锁定,在一定时间后释放或中断(interrupt )。
唤醒条件:
wait ) ) :到被调用的通告、通告全部
seep(: )至少直到过期或调用interrupt
使用:
sleep ) ) :用于时间同步
wait(:用于多线程同步)
-说点什么
个人QQ:1837307557
battcn开源群(面向初学者) 391619659
微信公众号: battcn (欢迎开玩笑) ) )。