Android中线程池使用

ThreadPoolManager

java 复制代码
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public enum ThreadPoolManager {
    INSTANCE;
    // 固定大小线程池
    private final ExecutorService fixedThreadPool;
    // 单线程线程池
    private final ExecutorService singleThreadPool;
    // 缓存线程池
    private final ExecutorService cachedThreadPool;
    // 定时任务线程池
    private final ScheduledExecutorService scheduledThreadPool;

    ThreadPoolManager() {
        // 创建固定大小线程池,线程数量为 CPU 核心数的两倍
        int coreCount = Runtime.getRuntime().availableProcessors();
        fixedThreadPool = Executors.newFixedThreadPool(coreCount * 2);

        // 创建单线程线程池
        singleThreadPool = Executors.newSingleThreadExecutor();

        // 创建缓存线程池
        cachedThreadPool = Executors.newCachedThreadPool();

        // 创建定时任务线程池,线程数量为 CPU 核心数的两倍
        scheduledThreadPool = Executors.newScheduledThreadPool(coreCount * 2);
    }

    /**
     * 在固定大小线程池中执行任务
     * @param task 要执行的任务
     */
    public void executeOnFixedThreadPool(Runnable task) {
        if (task != null) {
            fixedThreadPool.execute(task);
        }
    }

    public <T> Future<T> submit(Callable<T> callable) {
        if (callable != null) {
            return fixedThreadPool.submit(callable);
        }
        return null;
    }
    /**
     * 在单线程线程池中执行任务
     * @param task 要执行的任务
     */
    public void executeOnSingleThreadPool(Runnable task) {
        if (task != null) {
            singleThreadPool.execute(task);
        }
    }

    /**
     * 在缓存线程池中执行任务
     * @param task 要执行的任务
     */
    public void executeOnCachedThreadPool(Runnable task) {
        if (task != null) {
            cachedThreadPool.execute(task);
        }
    }

    /**
     * 在定时任务线程池中延迟执行任务
     * @param task 要执行的任务
     * @param delay 延迟时间
     * @param unit 时间单位
     */
    public void scheduleOnScheduledThreadPool(Runnable task, long delay, TimeUnit unit) {
        if (task != null) {
            scheduledThreadPool.schedule(task, delay, unit);
        }
    }

    /**
     * 在定时任务线程池中按固定速率执行任务
     * @param task 要执行的任务
     * @param initialDelay 初始延迟时间
     * @param period 执行周期
     * @param unit 时间单位
     */
    public void scheduleAtFixedRateOnScheduledThreadPool(Runnable task, long initialDelay, long period, TimeUnit unit) {
        if (task != null) {
            scheduledThreadPool.scheduleWithFixedDelay(task, initialDelay, period, unit);
        }
    }

    /**
     * 关闭所有线程池
     */
    public void shutdownAll() {
        if (!fixedThreadPool.isShutdown()) {
            fixedThreadPool.shutdown();
        }
        if (!singleThreadPool.isShutdown()) {
            singleThreadPool.shutdown();
        }
        if (!cachedThreadPool.isShutdown()) {
            cachedThreadPool.shutdown();
        }
        if (!scheduledThreadPool.isShutdown()) {
            scheduledThreadPool.shutdown();
        }
    }
}

ThreadUtils

java 复制代码
import android.os.Handler;
import android.os.Looper;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;


public enum ThreadUtils {
    INSTANCE;
    private final Handler mainHandler = new Handler(Looper.getMainLooper());

    /**
     * 在异步线程中执行任务
     * @param runnable 要执行的任务
     */
    public void executeAsync(Runnable runnable) {
        if (runnable != null) {
            ThreadPoolManager.INSTANCE.executeOnFixedThreadPool(runnable);
        }
    }

    /**
     * 在主线程中执行任务
     * @param runnable 要执行的任务
     */
    public void runOnMainThread(Runnable runnable) {
        if (runnable != null) {
            if (Looper.myLooper() == Looper.getMainLooper()) {
                // 如果当前已经在主线程,直接执行
                runnable.run();
            } else {
                // 否则,通过 Handler 切换到主线程执行
                mainHandler.post(runnable);
            }
        }
    }

    /**
     * 异步执行 Callable 任务并返回 Future
     * @param callable 要执行的任务
     * @param <T> 任务返回值的类型
     * @return 用于获取任务结果的 Future 对象
     */
    public <T> Future<T> submitAsync(Callable<T> callable) {
        if (callable != null) {
            return ThreadPoolManager.INSTANCE.submit(callable);
        }
        return null;
    }
}

使用:

Lambda 表达式()->{}说明:

  • 需 Java 8+(Android 需 minSdk ≥ 24,或启用 desugar 支持低版本)。
java 复制代码
//同步主线程
ThreadUtils.INSTANCE.runOnMainThread(()->{});
//异步子线程
ThreadUtils.INSTANCE.executeAsync(()->{});

()->{}比匿名内部类要好
	new Thread(){
        @Override
        public void run() {
            super.run();
                
        }
    }.start();
相关推荐
石山岭10 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
杉氧12 小时前
副作用 (Side Effects) 全攻略:如何像大师一样掌控 Composable 的生命周期?
android·架构·android jetpack
Kapaseker16 小时前
Kotlin Toolchain 0.11 发布:主要是把 Amper 干没了
android·kotlin
三少爷的鞋17 小时前
Android 现代架构不需要事件总线进阶篇
android
杉氧1 天前
深入理解 Compose 重组机制:快照系统如何驱动 UI 精准刷新?
android·架构·android jetpack
召钱熏1 天前
状态枚举正确≠渲染正确:一个语音按钮的状态机边界修复实录
android·前端
杉氧1 天前
深度解析:Jetpack Compose 核心架构与底层原理 —— 十年安卓老兵的“破茧重生”
android·架构·android jetpack
通玄1 天前
Jetpack Compose 入门系列(七):ViewModel 与界面状态管理
android
落魄Android在线炒饭1 天前
Android Framework 开发技巧:android.jar 生成与系统快速编译验证
android
如此风景1 天前
Kotlin Flow操作符学习
android·kotlin