返回

搞定多线程面试题!—Java线程调度和线程状态剖析

后端

Java 线程调度与线程状态:深入指南

线程调度

Java 线程调度是指 Java 虚拟机 (JVM) 负责将线程分配给 CPU 以执行的过程。它采用策略确保各个线程公平使用 CPU 时间并最大化其利用率。Java 线程调度的关键机制包括:

  • 线程优先级: 每个线程具有一个优先级,高优先级线程优先被调度执行。
  • 时间片: 每个线程都有一个时间片,当其时间片用完时,它将被挂起并让位于其他线程。
  • 抢占式调度: 当出现高优先级线程时,它可以抢占正在运行的低优先级线程的 CPU 时间。
  • 非抢占式调度: 低优先级线程不能抢占高优先级线程的 CPU 时间。

线程状态

Java 线程在生命周期中经历以下五种状态:

  • 新建状态: 线程对象被创建后进入此状态。
  • 就绪状态: 调用线程的 start() 方法后进入此状态,等待被调度执行。
  • 运行状态: 当线程被选中执行时进入此状态,正在执行任务。
  • 阻塞状态: 当线程等待资源(如锁或 I/O 操作结果)时进入此状态,无法执行任务。
  • 死亡状态: 当线程执行完毕或被终止时进入此状态,不再占用任何资源。

Java 线程调度和线程状态面试题

1. 线程调度的目的是什么?

提高 CPU 利用率并确保线程公平地使用 CPU 时间。

2. Java 线程调度机制如何运作?

包括线程优先级、时间片、抢占式调度和非抢占式调度。

3. Java 线程状态有哪些?

新建、就绪、运行、阻塞和死亡。

4. 如何创建新线程?

通过继承 Thread 类或实现 Runnable 接口。

5. 如何启动线程?

调用线程的 start() 方法。

6. 如何让线程等待?

使用 Thread.sleep(), Object.wait(), CountDownLatchCyclicBarrier 等方法。

7. 如何终止线程?

使用 Thread.stop(), Thread.interrupt()System.exit() 等方法。

8. 线程调度和线程状态有什么区别?

线程调度分配线程到 CPU,而线程状态线程在生命周期中的状态。

9. 线程调度和线程状态在 Java 编程中的作用是什么?

优化 CPU 利用率、了解线程行为并及时采取措施。

10. 如何优化 Java 线程调度?

使用合理优先级、减少线程数量、避免死锁和线程饥饿。

示例代码:

public class ThreadExample {

    public static void main(String[] args) {
        // 创建线程对象
        Thread thread1 = new Thread(() -> {
            // 线程任务
        });

        // 启动线程
        thread1.start();

        // 让主线程等待子线程完成
        try {
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 主线程完成任务
    }
}

常见问题解答

1. 什么是线程饥饿?

当低优先级线程长时间无法获得 CPU 时间时发生。

2. 如何避免线程饥饿?

使用线程优先级或适当的同步机制。

3. 什么是线程安全?

在并发环境中访问共享资源时不会导致程序崩溃或错误的状态。

4. 如何实现线程安全?

使用同步机制,例如锁、原子变量或不可变对象。

5. 什么是死锁?

当两个或多个线程等待对方持有的资源时发生。