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();
相关推荐
JMchen12320 分钟前
【Android 性能优化实战 60 讲】04 Memory Profiler 高阶玩法:深剖堆内存原理,实战定位 Kotlin 闭包隐式泄漏
android·性能优化·kotlin·实战·源码分析·内存泄漏·memory profiler
Android-Flutter24 分钟前
Java线程池 - 内部线程管理机制详解
android
开开心心就好27 分钟前
手机悬屏翻译工具外语游戏漫画APP全覆盖
android·前端·javascript·python·游戏·pdf·html
恋猫de小郭44 分钟前
AI 时代,也许你的 Flutter 需要一套 Dartastic OpenTelemetry 监控
android·前端·flutter
Kapaseker1 小时前
我为什么喜欢 Compose ?
android·kotlin
JMchen1231 小时前
【Android 性能优化实战 60 讲】03 Perfetto 现代分析利器:SQL 查询 Trace 数据,微秒级定位函数 CPU 耗时
android·sql·性能优化·实战·源码分析·perfetto·启动优化
开开心心就好2 小时前
手机精确倒计时工具悬浮窗口秒数实时显示
android·前端·javascript·jupyter·智能手机·pdf·html
墨狂之逸才2 小时前
一次 Android 工位机黑屏卡死排查:根因不是 App,而是 scrcpy 与 Rockchip 编码器的 DMA-BUF 泄漏
android·android studio
Privasa-隐私实验室2 小时前
跨端技术选型|Flutter搭建隐私加密App,安卓与iOS双端差异适配实战
android·笔记·安全·flutter·ios·隐私安全·aes-256
limuyang29 小时前
PDF Viewer KMP(基于 chrome 的 PDFium 内核)
android·kotlin