当前位置: 首页 > article >正文

【面试题】Java 多线程编程基础知识

  1. 线程的定义

    • 线程是程序执行流的最小单元,它是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间、文件描述符等,但每个线程都有自己独立的程序计数器、栈和局部变量等。
  2. 线程的实现方式

    • 继承Thread类
      • 定义一个类继承自Thread类,并重写run方法,run方法中包含线程要执行的逻辑。
      • 示例代码:
class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("This is a thread created by extending Thread class.");
    }
}
public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}
  • 实现Runnable接口
    • 定义一个类实现Runnable接口,实现run方法。
    • 创建Thread对象时,将实现了Runnable接口的对象作为参数传入Thread的构造函数,然后调用start方法启动线程。
    • 示例代码:
class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("This is a thread created by implementing Runnable interface.");
    }
}
public class Main {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread thread = new Thread(myRunnable);
        thread.start();
    }
}
  1. 线程池的参数含义

    • 核心线程数(corePoolSize)
      • 线程池中会一直存活的线程数量,即使这些线程处于空闲状态,也不会被销毁。当有新任务提交到线程池时,如果当前线程池中的线程数量小于核心线程数,线程池会创建新的线程来执行任务。
    • 最大线程数(maximumPoolSize)
      • 线程池允许创建的最大线程数量。当任务队列已满,且当前线程池中的线程数量小于最大线程数时,线程池会继续创建新的线程来处理任务。但线程数量达到最大线程数后,如果还有新任务提交,根据拒绝策略进行处理。
    • 队列容量
      • 用于存储等待执行任务的队列的最大容量。当线程池中的线程数量达到核心线程数后,新提交的任务会被放入任务队列中等待执行。如果任务队列已满,且当前线程池中的线程数量小于最大线程数,线程池会创建新的线程来处理任务;如果任务队列已满且线程池中的线程数量已经达到最大线程数,根据拒绝策略进行处理。
  2. 拒绝策略

    • AbortPolicy
      • 这是线程池的默认拒绝策略。当任务无法被执行(任务队列已满且线程池中的线程数达到最大线程数)时,会抛出RejectedExecutionException异常,阻止系统正常运行。
    • CallerRunsPolicy
      • 当任务无法被执行时,该策略会将任务交回给调用者(提交任务的线程)来执行。这样做可以降低新任务的提交速度,因为调用者在执行任务时,自身线程会被阻塞,从而减少了新任务的提交频率。
  3. 线程的状态及其切换条件

    • 新建(New)
      • 当创建一个Thread对象但还未调用start方法时,线程处于新建状态。此时线程还没有分配系统资源,只是一个对象而已。
    • 就绪(Runnable)
      • 调用start方法后,线程进入就绪状态。在这个状态下,线程已经准备好运行,等待获取CPU的使用权。处于就绪状态的线程可能会在多个线程之间竞争CPU资源。
    • 运行(Running)
      • 当就绪状态的线程获得CPU资源后,就进入运行状态,此时线程开始执行run方法中的代码。
    • 阻塞(Blocked)
      • 等待阻塞:调用Object类的wait方法,线程会进入等待阻塞状态,直到其他线程调用notifynotifyAll方法唤醒它。
      • 同步阻塞:当线程试图获取一个被其他线程持有的同步锁时,如果获取失败,线程会进入同步阻塞状态,直到获取到锁。
      • 其他阻塞:如调用Thread.sleep方法,线程会进入阻塞状态,直到指定的睡眠时间结束。
    • 死亡(Terminated)
      • run方法执行完毕,或者线程抛出一个未捕获的异常导致run方法提前结束,线程就进入死亡状态。此时线程的生命周期结束,不再具备执行能力。

通过对这些多线程编程基础知识的理解和掌握,可以更好地编写高效、稳定的多线程程序。


http://www.kler.cn/a/514521.html

相关文章:

  • PostgreSQL数据库的运行机制和架构体系
  • qml OpacityMask详解
  • Yaml的使用
  • macOS 安装JDK17
  • SDL2:PC端编译使用 -- SDL2多媒体库使用音频实例
  • Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
  • 分析一个深度学习项目并设计算法和用PyTorch实现的方法和步骤
  • 五、华为 RSTP
  • React 中hooks之useSyncExternalStore使用总结
  • NS3网络模拟器中如何利用Gnuplot工具像MATLAB一样绘制各类图形?
  • Vue - ref( ) 和 reactive( ) 响应式数据的使用
  • 22.日常算法
  • stm8s单片机(一) 工程塔建与第一个实验程序
  • 漏洞情报:为什么、要什么和怎么做
  • CrypTen——基于pytorch的隐私保护机器学习框架
  • Git进阶笔记系列(01)Git核心架构原理 | 常用命令实战集合
  • Julia语言的区块链
  • Java设计模式 三 工厂方法模式 (Factory Method Pattern)
  • HTML 基础入门:核心标签全解析
  • 深圳大学-计算机系统(3)-实验三取指和指令译码设计
  • simulink入门学习01
  • Redis、MongoDB 和 MySQL评估
  • IBM湖仓一体与向量数据库:访问MinIO控制台(Accessing the MinIO console)
  • AI对齐与开源发展:多学科融合创新之路
  • 第二讲 矩阵消元——用矩阵的左乘表示矩阵消元的过程
  • Spring注解篇:@RequestMapping详解