📜  如何在 Android 中使用 ThreadPoolExecutor?(1)

📅  最后修改于: 2023-12-03 15:08:33.090000             🧑  作者: Mango

如何在 Android 中使用 ThreadPoolExecutor?

在 Android 开发中,经常会遇到需要多线程执行任务的情况,这时就可以使用线程池来处理。Java 的 ThreadPoolExecutor 是一个非常方便的多线程处理工具类,Android 也提供了 ThreadPoolExecutor 的实现。

创建 ThreadPoolExecutor

要使用 ThreadPoolExecutor,首先需要创建一个线程池实例。下面是创建一个基础的 ThreadPoolExecutor 的代码:

int corePoolSize = 5; // 核心线程池大小
int maxPoolSize = 10; // 最大线程池大小
long keepAliveTime = 5000; // 线程空闲时间
TimeUnit unit = TimeUnit.MILLISECONDS; // 时间单位
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>(); // 任务队列
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue);

参数说明:

  • corePoolSize:线程池的核心线程数,即一开始就创建的线程数量。
  • maxPoolSize:线程池的最大线程数,当任务数大于核心线程数且任务队列满了之后,创建的最大线程数。
  • keepAliveTime:空闲线程的存活时间,即如果线程在指定时间内没有执行任务,就会被销毁。
  • unit:时间单位,上面的例子中使用了毫秒作为时间单位。
  • workQueue:任务队列,用于存储还没有执行的任务。
执行任务

线程池创建好后,就可以将任务提交到线程池中执行了。ThreadPoolExecutor 提供了两种方式来提交任务,分别是 execute() 方法和 submit() 方法。

execute() 方法是没有返回值的,只能用于提交 Runnable 类型的任务:

// 提交一个 Runnable 类型的任务
threadPoolExecutor.execute(new Runnable() {
    @Override
    public void run() {
        // 执行任务
    }
});

submit() 方法可以用于提交 Runnable 或 Callable 类型的任务,返回一个 Future 对象,可以通过 Futureget() 方法获取该任务的执行结果:

// 提交一个 Callable 类型的任务
Future<String> future = threadPoolExecutor.submit(new Callable<String>() {
    @Override
    public String call() throws Exception {
        // 执行任务
        return "result"; // 返回任务执行结果
    }
});

// 获取任务执行结果
try {
    String result = future.get();
} catch (ExecutionException e) {
    // 任务执行异常
} catch (InterruptedException e) {
    // 线程被中断
}
关闭线程池

在使用完 ThreadPoolExecutor 后,需要关闭线程池,释放系统资源。可以通过调用 shutdown()shutdownNow() 方法来关闭线程池。

shutdown() 方法会等待任务队列中的任务执行完成后再关闭线程池,而 shutdownNow() 方法会立即关闭线程池,可能会导致还没有执行完成的任务被取消掉。因此建议先调用 shutdown() 方法,再在必要情况下调用 shutdownNow() 方法。

// 关闭线程池
threadPoolExecutor.shutdown();
// threadPoolExecutor.shutdownNow();
总结

使用 ThreadPoolExecutor 可以很方便地处理多线程任务,提高应用程序的效率。在创建 ThreadPoolExecutor 时需要考虑线程数、任务队列等参数,任务可以通过 execute()submit() 方法提交到线程池中执行,执行完成后需要通过 shutdown() 方法关闭线程池。