zoukankan      html  css  js  c++  java
  • Java线程池面试

    New Thread的弊端

    • 每次new Thread会新建对象,性能差
    • 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或OOM
    • 缺少更多功能,如更多执行、定期执行、线程中断

    线程池优点

    • 重用存在的线程,减少对象创建、消亡的开销
    • 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞
    • 提供定时执行、定期执行、单线程、并发数控制等功能

    ThreadPoolExcutor的参数

    ThreadPoolExcutor: 线程池,可以通过调用 Executors 以下静态工厂方法来创建线程池并返回一个 ExecutorService 对象。

    • corePoolSize: 核心线程数量
    • maximumPoolSize: 允许创建的最大线程数
    • workQueue: 阻塞队列,存储等待执行的任务(重要)
    • keepAliveTime: 线程没有任务执行时最多保持多久时间终止
    • unit: keepAliveTime的时间单位(DAYS HOURS MINUTES MILLISECONDS MICROSECONDS NANOSECONDS)
    • threadFactory: 线程工厂,用来创建线程
    • rejectHandler: 当拒绝处理任务时的策略

    ThreadPoolExcutor的重要方法

    • execute() 向线程池提交一个任务,交由线程池去执行
    • submit() 也是用来向线程池提交任务的,但是它能够返回任务执行的结果,实际上还是调用的 execute()方法
    • shutdown() 关闭线程池,等待任务都执行完
    • shutdownNow() 关闭线程池,不等待任务都执行完

    常见的线程池及使用场景

    • newSingleThreadExecutor

    创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。用于需要保证顺序执行的场景,并且只有一个线程在执行。

    • newFixedThreadPool

    创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。用于已知并发压力的情况下,对线程数做限制。

    • newCachedThreadPool

    创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。比较适合处理执行时间比较小的任务。

    • newScheduledThreadPool

    创建一个定长线程池,支持定时及周期性任务执行。适用于需要多个后台线程执行周期任务的场景。

    • newWorkStealingPool

    一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行。

    线程生命周期

    • 新建状态(NEW)
      当程序使用new关键字创建了一个线程之后,该线程就处于新建状态,此时仅由JVM为其分配内存,并初始化其成员变量的值

    • 就绪状态(RUNNABLE)
      当线程对象调用了start()方法之后,该线程处于就绪状态。Java虚拟机会为其创建方法调用栈和 程序计数器,等待调度运行

    • 运行状态(RUNNING)
      如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态。

    • 阻塞状态(BLOCKED)
      阻塞状态是指线程因为某种原因放弃了cpu 使用权,也即让出了cpu timeslice,暂时停止运行。 直到线程进入可运行(runnable)状态,才有机会再次获得cpu timeslice 转到运行(running)状态。

    • 线程死亡(DEAD)
      线程会以下面三种方式结束,结束后就是死亡状态。
      正常结束
      run()或call()方法执行完成,线程正常结束。
      异常结束
      线程抛出一个未捕获的Exception或Error。
      调用 stop
      直接调用该线程的stop()方法来结束该线程—该方法通常容易导致死锁,不推荐使用。

  • 相关阅读:
    Delphi语法
    orcad中注意的事情
    Express web框架
    Docker
    Node.JS
    再次 WebAssembly 技术探讨
    WebAssembly 浏览器中运行c/c++模块
    Http 服务 简单示例
    CentOS7 开放服务端口
    Go linux 实践4
  • 原文地址:https://www.cnblogs.com/flyuz/p/11487670.html
Copyright © 2011-2022 走看看