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();
        }
    }
});

相关推荐

  1. android-线3

    2024-06-09 22:26:01       17 阅读
  2. python sqlite3 线封装

    2024-06-09 22:26:01       35 阅读
  3. android 线的管理工具类

    2024-06-09 22:26:01       39 阅读
  4. C-线

    2024-06-09 22:26:01       24 阅读
  5. 线

    2024-06-09 22:26:01       21 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 22:26:01       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 22:26:01       5 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 22:26:01       4 阅读
  4. Python语言-面向对象

    2024-06-09 22:26:01       6 阅读

热门阅读

  1. process to develop linux 5.4

    2024-06-09 22:26:01       23 阅读
  2. 软设之排序算法对比

    2024-06-09 22:26:01       12 阅读
  3. ghidra

    2024-06-09 22:26:01       16 阅读
  4. P11 品牌管理

    2024-06-09 22:26:01       18 阅读
  5. 爬山算法的详细介绍

    2024-06-09 22:26:01       18 阅读
  6. Flutter 常见报错记录

    2024-06-09 22:26:01       21 阅读
  7. 解决更新Android Studio后下载Gradle超时

    2024-06-09 22:26:01       16 阅读
  8. 给自己Linux搞个『回收站』,防止文件误删除

    2024-06-09 22:26:01       20 阅读