一、线程等待
在Object类中有一些函数可以用于线程的等待:
1.1 wait()
当一个线程A调用一个共享变量wait()方法时,线程A会被阻塞挂起,发生以下情况才会返回:
(1)线程A调用了共享对象的notify()或者notifyAll()方法。
(2)其它线程调用了线程A的interrupt()方法,线程A抛出InterruptedException异常返回。
1.2 wait(long timeout)
这个方法比wait方法多了个超时参数,它的不同之处在于,如果线程A调用共享对象的wait(long timeout)方法后,没有在指定的timeout ms时间内被其它线程唤醒,那么这个方法还是会因为超时而返回。
1.3 wait(long timeout,int nanos)
其内部调用的是wait(long timeout)函数。
1.4 join()
Thread类也提供了一个方法用于等待的方法:
如果一个线程A执行了thread.join()语句,其含义是:当前线程A等待thread线程终止之后才从thread.join()返回。
二、唤醒线程
2.1 notify()
一个线程A调用共享对象的notify()方法后,会唤醒一个在这个共享变量上调用wait系列方法后被挂起的线程。一个共享变量上可能会有多个线程在等待,具体唤醒哪个等待线程都是随机的。
2.2 notifyAll()
不同于在共享变量上调用notifyAll()函数会被唤醒被阻塞到该共享变量上的一个线程,notifyAll()方法会唤醒所有在该共享变量上由于调用wait系列方法而被挂起的线程。
三、线程休眠
3.1 sleep()
Thread类中的静态方法,当一个执行中的线程A调用了Thread的sleep方法后,线程A会暂时让出指定时间的执行权,但是线程A所拥有的监视器资源,比如锁还是持有不让出的。
指定睡眠时间到了之后该函数会正常返回,接着参与CPU调度,获取到CPU资源后就可以接着继续运行。
四、让出优先权
yeild():Thread类中的静态方法,当一个线程调用yield方法时,实际上是在暗示线程调度器当前线程请求让出自己的CPU执行权,但是线程调度器可以选择是否接受或者忽略该请求。
五、线程中断
Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。
5.1 void interrupt()
中断线程,例如:当线程A运行时,线程B可以调用线程的interrupt()方法来设置线程的中断标志为true并立即返回。
设置标志仅仅是设置标志,线程A并没有被中断,会继续往下执行。
5.2 boolean isInterrupted()
检测当前线程是否被中断。
5.3 boolean interrupted()
检测当前线程是否被中断,与isInterrupted不同的是,该方法如果发现当前线程被中断,则会清除中断标志。