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

线程等待与通知

在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()方法会清除中断标志。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题