线程有哪些常用的调度方法?

线程有哪些常用的调度方法?
线程等待与通知
在Object类中,存在一些用于线程等待与通知的方法。
wait(): 当线程A调用共享对象的wait()方法时,线程A会被阻塞挂起,直到发生以下几种情况才会返回:
- (1) 线程A被其他线程调用共享对象的notify()或notifyAll()方法唤醒。
- (2) 其他线程调用线程A的interrupt()方法,导致线程A抛出InterruptedException异常返回。
- wait(long timeout): 此方法与wait()方法相似,但多了一个超时参数。如果线程A调用共享对象的wait(long timeout)方法后,在指定的timeout毫秒内未被其他线程唤醒,则该方法会因超时而返回。
上述两个方法中,wait(long timeout, int nanos)是内部调用了wait(long timeout)方法的实现。
唤醒线程的主要方法如下:
- notify(): 当一个线程A调用共享对象的notify()方法时,它会唤醒一个因调用wait系列方法而被挂起的线程。在一个共享对象上可能有多个线程等待,具体唤醒哪个等待的线程是随机的。
- notifyAll(): 与notify()方法不同,调用notifyAll()方法会唤醒在该共享对象上因调用wait系列方法而被挂起的所有线程。
Thread类也提供了一个等待方法:
- join(): 当线程A执行thread.join()语句时,表示当前线程A等待thread线程终止后才从thread.join()返回。
线程休眠
- sleep(long millis): sleep是Thread类的静态方法,当执行中的线程A调用sleep方法后,线程A会暂时让出指定时间的执行权。然而,线程A仍然持有其拥有的监视器资源(如锁),不会释放它们。一旦指定的睡眠时间过去,sleep方法会正常返回,线程A可以继续运行,参与CPU调度。
让出优先权
- yield(): yield是Thread类的静态方法,当一个线程调用yield方法时,实际上是在暗示线程调度器当前线程请求让出CPU。但线程调度器可以选择无条件忽略这个暗示。
线程中断
线程中断是Java中一种线程间的协作模式,通过设置线程的中断标志并不能直接终止线程的执行,而是被中断的线程根据中断状态自行处理。
- void interrupt(): 中断线程。例如,当线程A正在运行时,线程B可以调用线程A的interrupt()方法,将线程A的中断标志设置为true,并立即返回。设置标志只是设置标志,线程A实际上并没有被中断,它会继续执行。
- boolean isInterrupted()方法:检查当前线程是否被中断。
- boolean interrupted()方法:检查当前线程是否被中断。与isInterrupted方法不同的是,如果发现当前线程被中断,interrupted()方法会清除中断标志。