public static native void yield();
静态的native方法。用于交出当前线程的CPU执行权,使线程变为就绪状态,等待下一次获得CPU执行权,再执行线程中业务。下面是JDK对这个方法的注释:
很少适合使用这种方法。它可能对调试或测试有用,因为它可能有助于重现由于竞争条件导致的错误。在设计并发控制结构时,它可能也很有用。如java.util.concurrent.locks包。
由此可知该方法的使用场景很少
等待调用对象线程执行完后,再往下执行主线程的代码。这个方法可以使多个线程同步执行。例如,在A线程业务中,获得B线程对象,然后B线程对象调用join()方法。那么A线程就会阻塞在B.join()代码处,等B线程执行完后,A线程才继续往下执行。
强制杀死线程,类似于linux中kill-9 杀死进程的效果,不安全,已被jdk标为弃用方法。
相对应的方法有三个,分别为:
interrupt():
给线程标记一个状态位,表示该线程可以终止了,而不是终止这个线程。
isInterrupted():
判断线程是否被打了可中断的标志位,通过这个方法,来对可中断的线程做进一步处理,例如释放资源等操作,让线程安全终止退出。
(static) interrupted():
静态方法,返回线程是否有可中断标志,并且将可中断标志改为false。这个方法会修改线程的可中断标志状态为false。用于判断线程是否可中断,如果可中断,状态改为不可中断状态,并且做一些业务逻辑处理。
这种通过给线程设置标识的方式来停止线程的方法,称之为协作式并发编程。
相关方法包括wait()方法、notify()方法、notifyAll()方法。需要注意的是,这三个方法并不是Thread类的方法,而是Object类的方法。原因是这三个方法,只能用在synchroinzed同步代码块中,需要由同步代码块的锁对象来调用。而任何对象都可以充当锁对象,所以只能将这三个方法设计到Object类中。
这几个方法的作用就是,当一个线程抢到锁后,而这个线程又不满足执行逻辑,则调用锁对象.wait()方法,来释放锁,释放锁后,其他线程抢到这把锁,执行完逻辑,并调用锁对象.notify或notifyAll方法,通知wait()方法继续往下执行。等wait方法抢占到CPU资源后,就继续往下执行了。notify和notifyAll方法不会释放锁,只有等同步代码块执行完后才释放锁。wait方法会释放锁。
在某个线程进入sleep()、await()等阻塞方法时,如果在其他线程中,调用这个线程对象的interrput()方法,对线程进行中断,则这个线程中正在执行的sleep()等阻塞方法就会抛出InterrputException异常,并且把线程的interrput状态标志为false。
JDK如此设计的用意是为了进行阻塞线程的人为中断。例如,当一个线程sleep()很长时间,但是想停止这个线程的中断应该怎么办呢?那就在其他线程中获取到这个正在阻塞的线程,然后调用interrupt()方法,这个线程就不再阻塞,而是抛出InterrputException异常,在catch代码块,对异常进行处理。
老生常谈的问题,不再过多解释,一张图完事儿: