您的位置:

Java线程池面试题详解

一、安卓线程池面试题

安卓线程池通常使用ThreadPoolExecutor类,该类实现了ExecutorService接口来提供线程的管理。而在安卓应用中常用的线程池主要有四个:

  • FixedThreadPool:固定线程池
  • CacheThreadPool:缓存线程池
  • ScheduledThreadPool:定期或定时执行任务的线程池
  • SingleThreadPool:单线程线程池

这些都是通过ThreadPoolExecutor类实现的,这个类同样也是Java线程池的重要实现类。

二、线程和线程池面试题

线程池是一种典型的对象池技术,它的主要功能是管理线程、控制线程数量、避免线程创建和销毁带来的性能开销,提升系统性能

线程池中的几个重要组成部分:

  • 任务队列
  • 线程池管理器
  • 工作线程

线程池通常具备的优点:

  • 降低资源消耗:使用线程池可以避免线程的重复创建和销毁,减少了系统资源的消耗
  • 提高程序响应速度:使用线程池可以更快地响应外部请求,提高程序的响应速度,尤其是在高并发的情况下
  • 提供更稳定的服务质量:由线程池管理,可以对系统中的任务进行有效的分配、统一的管理,提高服务质量和稳定性

三、线程池的工作原理面试题

线程池的核心是一种生产者-消费者的模式,生产者就是任务,消费者就是线程池中的工作线程。它们通过任务队列(COMMOND QUEUE)进行沟通。

若当前线程池中的线程数小于核心线程数,则有新任务加入时,线程池会直接创建一个新线程来处理任务;若当前线程数大于或等于核心线程数且任务队列未满,则新任务将被加入任务队列并等待处理。

若当前线程数量超过了核心线程的数量且任务队列已满,那么线程池会有一定的策略来处理这种情况,通常为线程池的拒绝策略:Abort策略,调用者直接抛出异常;Discard策略,直接丢弃任务;Discard-oldest策略,丢弃时间最久的任务;Caller-runs策略,在任务提交者的线程中运行此任务。

四、线程池七大核心参数面试题

线程池在创建时传入了七个核心参数,这些参数是线程池的容量和管理规则,涉及到线程的创建、销毁等一系列问题。

  • corePoolSize:核心线程数,线程池中一般会被保持的线程的最小数量
  • maximumPoolSize:最大线程数,线程池中允许创建的最大线程数目
  • keepAliveTime:存活时间,线程池中非核心线程的空闲时间,超出这个时间就会被回收
  • unit:时间单位,用来指定keepAliveTime的时间单位
  • workQueue:等待队列,一种存放等待任务的阻塞队列
  • threadFactory:线程工厂,一般用来定制新线程的执行规则,如名称、优先级、是否后台线程等
  • handler:拒绝策略处理器,用来处理线程池中已满状态下的新任务,通常有Abort策略、Discard策略等

五、Java线程池实例示例

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

// 定义任务类型
class Task implements Runnable {
  private int id;
  public Task(int id) {
      this.id = id;
  }
  public void run() {
      System.out.println(Thread.currentThread().getName() + " is executing task " + id);
  }
}

// 实例化线程池
ExecutorService pool = Executors.newFixedThreadPool(5);

// 提交任务给线程池
for (int i = 0; i < 10; i++) {
    pool.execute(new Task(i));
}

// 关闭线程池
pool.shutdown();