sleep ()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有 synchronized 同步块,其他线程仍然不能访问共享数据。 作用于线程
· Thread .sleep()方法用来暂停线程的执行,将CPU放给线程调度器。
· Thread.sleep()方法是一个 静态方法 ,它暂停的是当前执行的线程。
· java 有两种sleep方法,一个只有一个毫秒参数,另一个有毫秒和 纳秒 两个参数。
· 与wait方法不同,sleep方法不会释放锁
· 如果其他的线程中断了一个休眠的线程,sleep方法会抛出Interrupted Exception。
· 休眠的线程在唤醒之后不保证能获取到CPU,它会先进入就绪态,与其他线程竞争CPU。
· 有一个易错的地方,当调用t.sleep()的时候,会暂停线程t。这是不对的,因为Thread.sleep是一个静态方法,它会使当前线程而不是线程t进入休眠状态。
yield (): 它仅仅释放线程所占有的CPU资源,从而让其他线程有机会运行,但是并不能保证某个特定的线程能够获得CPU资源。谁能获得CPU完全取决于调度器,在有些情况下调用yield方法的线程甚至会再次得到CPU资源。所以,依赖于yield方法是不可靠的,它只能尽力而为。 作用于线程
join (): 当前线程等待调用此方法的线程执行结束再继续执行。如:在main方法中调用t.join(),那main方法在此时进入阻塞状态,一直等t线程执行完,main方法再恢复到就绪状态,准备继续执行。
join方法必须在线程start方法调用之后调用才有意义。这个也很容易理解:如果一个线程都没有start,那它也就无法同步了。 作用于线程
实现原理
wait ():
· wait只能在同步(synchronize)环境中被调用,而sleep不需要。
· 进入wait状态的线程能够被notify和notifyAll线程唤醒,但是进入sleeping状态的线程不能被notify方法唤醒。
· wait通常有条件地执行,线程会一直处于wait状态,直到某个条件变为真。但是sleep仅仅让你的线程进入睡眠状态。
· wait方法在进入wait状态的时候 会释放对象的锁 ,但是sleep方法不会。
wait方法是针对一个被 同步代码块 加锁的对象
《Java多线程面试题》
出版单位:北京尚学堂优效学院
著:张洋
优效学院_张洋老师
11年工作经验 曾就职联众游戏(程序员)、众信旅游(Team Leader)、精智教育(联合创始人)、中国石化(大数据高级顾问) 精通 javaEE 体系、互联网产品架构,熟悉Sap Bw/HANA、多个大数据项目经验。
20180926版
本文章为连载内容,大家可以持续关注小编,我将尽其所能的为大家提供技术性实践资料、文章、视频。
感谢大家的支持!
Hi , I do believe this is an excellent blog. I stumbled upon it on Yahoo , i will come back once again. Money and freedom is the best way to change, may you be rich and help other people.