sleep()、join()、yield()有什么区别

sleep()

sleep() 方法须要指定等待的时间,它可让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可让其余同优先级或者高优先级的线程获得执行的机会,也可让低优先级的线程获得执行机会。可是 sleep() 方法不会释放“锁标志”,也就是说若是有 synchronized 同步块,其余线程仍然不能访问共享数据。spa

wait()

wait() 方法须要和 notify()notifyAll() 两个方法一块儿介绍,这三个方法用于协调多个线程对共享数据的存取,因此必须在 synchronized 语句块内使用,也就是说,调用 wait()notify()notifyAll() 的任务在调用这些方法前必须拥有对象的锁。注意,它们都是 Object 类的方法,而不是 Thread 类的方法。线程

wait() 方法与 sleep() 方法的不一样之处在于,wait() 方法会释放对象的“锁标志”。当调用某一对象的 wait() 方法后,会使当前线程暂停执行,并将当前线程放入对象等待池中,直到调用了 notify() 方法后,将从对象等待池中移出任意一个线程并放入锁标志等待池中(随机唤醒一个线程),只有锁标志等待池中的线程能够获取锁标志,它们随时准备争夺锁的拥有权。当调用了某个对象的 notifyAll() 方法,会将对象等待池中的全部线程都移动到该对象的锁标志等待池。code

除了使用 notify()notifyAll() 方法,还可使用带毫秒参数的 wait(long timeout) 方法,效果是在延迟 timeout 毫秒后,被暂停的线程将被恢复到锁标志等待池。对象

wait ( )和wait (long timeout) 方法不一样之处在于前者不必定会再次参与锁的竞争,后者会再次参与锁的竞争,关键因素在因而否将线程对象放入锁标志等待池中。同步

此外,wait()notify()notifyAll() 只能在 synchronized 语句中使用,可是若是使用的是 ReenTrantLock 实现同步,该如何达到这三个方法的效果呢?解决方法是使用 ReenTrantLock.newCondition() 获取一个 Condition 类对象,而后 Conditionawait()signal() 以及 signalAll() 分别对应上面的三个方法。it

yield()

yield() 方法和 sleep() 方法相似,也不会释放“锁标志”,区别在于,它没有参数,即 yield() 方法只是使当前线程从新回到可执行状态,因此执行 yield() 的线程有可能在进入到可执行状态后立刻又被执行,另外 yield() 方法只能使同优先级或者高优先级的线程获得执行机会,这也和 sleep() 方法不一样io

join()

join() 方法会使当前线程等待调用 join() 方法的线程结束后才能继续执行class

相关文章
相关标签/搜索