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();
相关推荐
李堇6 小时前
android滚动列表VerticalRollingTextView
android·java
lxysbly8 小时前
n64模拟器安卓版带金手指2026
android
游戏开发爱好者810 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码203511 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥11 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓11 小时前
[JDBC]元数据
android
独行soc11 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能11 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿11 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc12 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮