转自:
Java线程sleep,yield,join,wait方法详解
下文讲述java线程中常见的方法功能简介说明
sleep()
当线程调用sleep方法后,此线程会放弃cpu,进入阻塞队列
sleep(long millis) 此方法的功能是Thread类中的静态方法 millis:设置线程的休眠时间,其单位为毫秒
注意事项:
1.线程调用sleep时,其他线程可继续运行
2.线程调用sleep时,此时不会释放对象锁,如:synchronized
通常以上的写法,我们应该避免在synchronized中使用sleep(因为会使多线程的排队时间变的更长)
yield()
yield()方法中没有参数
yield()方法的功能:
当此时拥有其他同等优先级的线程处于就绪状态时,则当前线程会停止运行,其他线程则会获取CPU进行运行
sleep()和yield()方法:
以上两个方法都是Thread中的静态方法,都可停止当前线程的运行
----------------------------------------------------------------
sleep()和yield()方法的区别:
1.sleep不会管线程的优先级,直接将当前线程停止,处于阻塞状态
yield()方法如果没有同优先级的线程,则yield()方法无任何作用
2.sleep()方法会抛出异常,需捕捉异常
yield()方法不会抛出异常
3.sleep()方法运行后,当前线程处于阻塞状态
yield()方法运行后,当前线程会处于就绪状态
join()
当在当前线程中调用另一个线程的join()方法时,此时当前线程会进入阻塞队列,需等待另一个线程结束后,当前线程才会恢复运行
wait()和notify()、notifyAll()
以上方法是Object类中的方法,其功能为对锁进行操作
常在同步代码块中使用
使用此种方式即可在其它线程中共享其中的数据
wait()方法使当前线程暂停执行并释放对象锁,此时其他线程可以进入synchronized数据块
当前线程被放入对象等待池中
当调用notify()方法后,将从对象的等待池中有机会移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志
如果锁标志等待池中没有线程,则notify()不起作用
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中