android-线程池3

复制代码
工具类
package com.changan.incalleventservice.utils;

import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ExecutorUtil {
    /**
     * 默认缓冲队列长度:500
     */
    private static final int DEFAULT_POOL_CAPACITY = 500;

    /**
     * 业务线程池定义
     * 核心线程数:可以根据Runtime.getRuntime().availableProcessors()
     */
    private static final ThreadPoolExecutor taskExecutor = new ThreadPoolExecutor(
            4,
            16,
            10,
            TimeUnit.SECONDS,
            new LinkedBlockingQueue<>(DEFAULT_POOL_CAPACITY),
            Executors.defaultThreadFactory(), (r, executor) -> LogUtil.e(r.toString() + "执行了拒绝策略"));
    
    /**
     * 清缓存线程池
     */
    public static void CLEARESERVICE() {
        if (taskExecutor.getQueue().size() > 0) {
            taskExecutor.getQueue().clear();
            LogUtil.w("getPoolExecutorInfo ,clear,clear,clear");
        }
    }

    /**
     * 把父线程的MDC内容赋值给子线程
     *
     * @param runnable
     */
    public static void execute(Runnable runnable) {
        taskExecutor.execute(() -> run(runnable));
    }

    public static <T> Future<T> submit(Callable<T> task) {
        return taskExecutor.submit(() -> call(task));
    }

    /**
     * 子线程委托的执行方法
     *
     * @param runnable {@link Runnable}
     */
    private static void run(Runnable runnable) {
        runnable.run();// 执行异步操作
    }

    /**
     * 子线程委托的执行方法
     *
     * @param task {@link Callable}
     */
    private static <T> T call(Callable<T> task) throws Exception {
        return task.call(); // 执行异步操作
    }
}

使用:

复制代码
ExecutorUtil.execute(() -> {
    while (true) {
        try {
            LogUtil.d("serverSocket=" + serverSocket + ",inetSocketAddress=" + inetSocketAddress+"开始等待客户端接入");
            Socket socket = serverSocket.accept();
            if (!TCPSocketManager.getInstance().phoneStatus) {
                LogUtil.d("开始读取");
                loopRead(socket, inetSocketAddress); // 循环读取
            }else {
                canNotConected(socket);
            }
            LogUtil.d("结束读取 等待新客户端接入中 :: phostate"+TCPSocketManager.getInstance().phoneStatus);
        } catch (Throwable e) {
            LogUtil.d("Socket通信有问题  原因:"+e.getMessage());
            e.printStackTrace();
            close();
        }
    }
});
相关推荐
Kapaseker2 小时前
你不看会后悔的2025年终总结
android·kotlin
alexhilton5 小时前
务实的模块化:连接模块(wiring modules)的妙用
android·kotlin·android jetpack
ji_shuke6 小时前
opencv-mobile 和 ncnn-android 环境配置
android·前端·javascript·人工智能·opencv
sunnyday04268 小时前
Spring Boot 项目中使用 Dynamic Datasource 实现多数据源管理
android·spring boot·后端
幽络源小助理9 小时前
下载安装AndroidStudio配置Gradle运行第一个kotlin程序
android·开发语言·kotlin
inBuilder低代码平台9 小时前
浅谈安卓Webview从初级到高级应用
android·java·webview
豌豆学姐9 小时前
Sora2 短剧视频创作中如何保持人物一致性?角色创建接口教程
android·java·aigc·php·音视频·uniapp
白熊小北极10 小时前
Android Jetpack Compose折叠屏感知与适配
android
HelloBan10 小时前
setHintTextColor不生效
android
洞窝技术12 小时前
从0到30+:智能家居配网协议融合的实战与思考
android