Java多线程相关的API方法以及作用摘要

wait() 会让当前运行线程 阻塞,并释放对应的对象锁, 一般由当前线程持有的对象锁调用 x.wait();
当前线程必须拥有此对象的monitor(即锁),才能调用此对象的wait()方法能让当前线程阻塞,

notify() 会让等待当前线程持有的锁的线程唤醒,进入就绪状态。如果有多个线程等待获取锁,将有一个线程随机获取,进入就绪状态;

wait(long timeout) 会让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”);

notifyAll() 会让等待当前线程持有的锁的所有线程唤醒。然后将有一个线程随机获取锁,几率取决于cpu调度

yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!
和wait() 的差别:
1.wait()是让当前线程从运行到阻塞,yield()是让线程从运行到就绪状态;
2.wait()释放锁,yield()并不释放锁,yield()是当前线程让出cpu执行时间片
所以,如果多个线程竞争一个锁,一个已持有锁线程yield()并不会导致其他线程获得锁并执行。

sleep()的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。 sleep()不释放锁

join()让“主线程”等待“子线程”结束之后才能继续运行。使得两个线程可以串行运行

猜你喜欢

转载自www.cnblogs.com/liumz0323/p/10473667.html