Java主方法中运行异步方法及示例分享

重生 Java经验 发布时间:2024-02-09 23:28:45 阅读数:18228 1
下文笔者讲述Java中实现一个"主方法中异步运行另一个方法的方法及示例分享"
我们只需在主方法中 
    开启一个线程运行另一个方法(异步操作即可)

线程工具类

public class ThreadPoolUtils {
    private static final Logger LOGGER = LoggerFactory.getLogger(ThreadPoolUtils.class);
    private static final String POOL_NAME = "thread-im-runner";
    // 等待队列长度
    private static final int BLOCKING_QUEUE_LENGTH = 20000;
    // 闲置线程存活时间
    private static final int KEEP_ALIVE_TIME = 5 * 1000;
    private static ThreadPoolExecutor threadPool = null;

    private ThreadPoolUtils() {
        throw new IllegalStateException("utility class");
    }

    /**
     * 无返回值直接执行
     *
     * @param runnable 需要运行的任务
     */
    public static void execute(Runnable runnable) {
        getThreadPool().execute(runnable);
    }

    /**
     * 有返回值执行 主线程中使用Future.get()获取返回值时,会阻塞主线程,直到任务执行完毕
     *
     * @param callable 需要运行的任务
     */
    public static <T> Future<T> submit(Callable<T> callable) {
        return getThreadPool().submit(callable);
    }

    private static synchronized ThreadPoolExecutor getThreadPool() {
        if (threadPool == null) {
            // 核心线程数、最大线程数、闲置线程存活时间、时间单位、线程队列、线程工厂
            //当前线程数已经超过最大线程数时的异常处理策略
            threadPool = new ThreadPoolExecutor(50, 500, KEEP_ALIVE_TIME, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<>(BLOCKING_QUEUE_LENGTH),
                new ThreadFactoryBuilder().setNameFormat(POOL_NAME + "-%d").build(),
                new ThreadPoolExecutor.AbortPolicy() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
                        LOGGER.warn("线程过多,当前运行线程总数:{},活动线程数:{}。等
                           待队列已满,等待运行任务数:{}", e.getPoolSize(), e.getActiveCount(),
                            e.getQueue().size());
                    }
                });
        }
        return threadPool;
    }

    private static synchronized ThreadPoolExecutor getThreadPoolByCpuNum() {
        if (threadPool == null) {
            // 获取处理器数量
            int cpuNum = Runtime.getRuntime().availableProcessors();
            // 根据cpu数量,计算出合理的线程并发数
            int maximumPoolSize = cpuNum * 2 + 1;
            // 核心线程数、最大线程数、闲置线程存活时间、时间单位、线程队列、线程工厂\
            // 当前线程数已经超过最大线程数时的异常处理策略
            threadPool = new ThreadPoolExecutor(maximumPoolSize - 1, maximumPoolSize, KEEP_ALIVE_TIME,
                TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(BLOCKING_QUEUE_LENGTH),
                new ThreadFactoryBuilder().setNameFormat(POOL_NAME + "-%d").build(),
                new ThreadPoolExecutor.AbortPolicy() {
                    @Override
                    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
                        LOGGER.warn("线程爆炸了,当前运行线程总数:{},活动线程数:{}。
                          等待队列已满,等待运行任务数:{}", e.getPoolSize(), e.getActiveCount(),
                            e.getQueue().size());
                    }
                });
        }
        return threadPool;
    }
}

主方法中运行异步方法的示例

ThreadPoolUtils.execute(() -> {
    //逻辑方法
});
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202402/17074925977949.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者