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();
        }
    }
});
相关推荐
恋猫de小郭42 分钟前
Flutter 3.38 发布,快来看看有什么更新吧
android·前端·flutter
百锦再6 小时前
第11章 泛型、trait与生命周期
android·网络·人工智能·python·golang·rust·go
会跑的兔子7 小时前
Android 16 Kotlin协程 第二部分
android·windows·kotlin
键来大师7 小时前
Android15 RK3588 修改默认不锁屏不休眠
android·java·framework·rk3588
江上清风山间明月10 小时前
Android 系统超级实用的分析调试命令
android·内存·调试·dumpsys
百锦再10 小时前
第12章 测试编写
android·java·开发语言·python·rust·go·erlang
用户693717500138414 小时前
Kotlin 协程基础入门系列:从概念到实战
android·后端·kotlin
SHEN_ZIYUAN14 小时前
Android 主线程性能优化实战:从 90% 降至 13%
android·cpu优化
曹绍华14 小时前
android 线程loop
android·java·开发语言
雨白14 小时前
Hilt 入门指南:从 DI 原理到核心用法
android·android jetpack