Thread类的sleep、join、yield、interrupt方法与Object类的wait、notify、notifyAll方法

主要从用途、场景及结合锁和cpu资源说下这几个方法,用于记录自己的学习心得。

一、interrupt方法:

改变中断状态,无法中断正在运行的线程。中断的真正原理是当线程被Object.wait(),Thread.join()或sleep()方法阻塞时,调用interrupt()方法后改变中断状态,而wait/join/sleep这些方法内部会不断地检查线程的中断状态值,当发现中断状态值改变时则抛出InterruptedException异常。可以通过Thread.currentThread().isInterrupted()来获取当前线程的中断状态。

二、sleep方法:

调用该方法后,当前线程会阻塞。释放cpu资源。在sleep期间,被调用interrupt方法时,会抛异常。如果该线程已经获取锁,那么执行该方法后,不会释放锁,其他线程仍然无法获取锁。

三、join方法:

阻塞型方法,底层在一个while循环中调用的isAlive()方法,来判断线程是否执行完成。

四、yield方法:

让出cpu资源,重新竞争cpu资源。线程进入就绪状态


图片来源:https://www.cnblogs.com/stg609/p/3857242.html

五、wait、notify、nofityAll方法(此处来源:http://iteye.blog.163.com/blog/static/1863080962012111424544215/)

这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用。synchronized关键字用于保护共享数据,阻止其他线程对共享数据的存取,但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。

wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。

notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

这三个方法与  ReentrantLock的condition的await()、signal、signalAll方法结合功能类似