Java高级面试指南 - 多线程

daicy
发布于 2020-05-05 / 1636 阅读
0
0

Java高级面试指南 - 多线程

第一个问题:请解释一下 Java 中线程的生命周期有哪些阶段?
Java 中线程的生命周期可分为以下几个明确的阶段:
一、新建状态(New):当通过 new Thread() 等方式创建一个线程对象时,线程处于新建状态。此时线程仅仅是在 JVM 中被分配了内存空间,还未真正启动执行。

二、就绪状态(Runnable):当调用线程对象的 start() 方法后,线程进入就绪状态。处于就绪状态的线程已经具备了运行的条件,正在等待 JVM 调度器分配 CPU 时间片来执行。在这个状态下,线程随时可能被选中并开始执行。

三、运行状态(Running):当 JVM 调度器将 CPU 时间片分配给一个就绪状态的线程时,该线程进入运行状态,开始执行其 run() 方法中的代码。在运行状态下,线程会一直执行,直到被以下情况中断:

  1. 线程主动让出 CPU 时间片,比如调用了 Thread.yield() 方法。
  2. 线程因等待资源而进入阻塞或等待状态。
  3. 线程执行完毕。

四、阻塞状态(Blocked):当线程在运行过程中试图获取一个被其他线程持有的锁时,或者等待其他线程的特定操作完成时,会进入阻塞状态。例如,当一个线程调用了 synchronized 方法或代码块,而其他线程已经持有了该锁,当前线程就会进入阻塞状态等待锁的释放。

五、等待状态(Waiting):当线程调用了对象的 wait() 方法时,会进入等待状态。处于等待状态的线程会一直等待,直到其他线程调用该对象的 notify() 或 notifyAll() 方法来唤醒它。这种状态通常用于线程之间的协作。

六、计时等待状态(Timed Waiting):当线程调用了带超时时间参数的方法,如 Thread.sleep(long millis)、Object.wait(long timeout) 等,会进入计时等待状态。在这种状态下,线程会等待一段时间,如果在超时时间到达之前被唤醒,或者等待的条件满足,线程会退出计时等待状态;如果超时时间到达仍未被唤醒,线程也会自动退出计时等待状态。

七、终止状态(Terminated):当线程的 run() 方法执行完毕,或者因异常而退出时,线程进入终止状态。一旦线程进入终止状态,就不能再重新启动。

综上所述,Java 线程的生命周期是一个复杂但有规律可循的过程,理解这些状态对于编写高效、可靠的多线程程序至关重要。”

优点

  • 非常全面且准确地阐述了 Java 线程生命周期的各个阶段,每个阶段都有详细的解释和说明。
  • 语言表达清晰、专业,逻辑严谨。
  • 举例恰当,有助于更好地理解各个状态。

打分原因:回答全面、深入、准确,语言表达优秀,举例恰当,故可以给到 10 分。

第二个问题:在 Java 中,如何实现线程之间的通信?
“在 Java 中,实现线程之间通信主要有以下几种方式:


评论