如何在运行主方法的同时异步运行另一个方法,我是用来更新缓存;
1. 工具类
- 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;
- }
- }
复制代码 2.实际使用
- ThreadPoolUtils.execute(() -> {
- this.Method();
- });
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |