📅  最后修改于: 2023-12-03 15:08:33.090000             🧑  作者: Mango
在 Android 开发中,经常会遇到需要多线程执行任务的情况,这时就可以使用线程池来处理。Java 的 ThreadPoolExecutor
是一个非常方便的多线程处理工具类,Android 也提供了 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
对象,可以通过 Future
的 get()
方法获取该任务的执行结果:
// 提交一个 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()
方法关闭线程池。