package com.snowcattle.game.common.util; import com.snowcattle.game.common.constant.CommonErrorLogInfo; import com.snowcattle.game.common.constant.Loggers; import org.slf4j.Logger; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; /** * 提供对{@link ExecutorService}的工具类 * * * */ public class ExecutorUtil { private static final Logger logger = Loggers.utilLogger; /** 默认的{@link ExecutorService}关闭前等待其中的任务结束的时间:5分钟 */ private static final int DEFAULT_AWAIT_TERMINATE_MINUTES = 5; /** * 关闭{@link ExecutorService},在关闭之前最多等待 * {@link #DEFAULT_AWAIT_TERMINATE_MINUTES}分钟来满足其中已经开始任务结束 * * @param executorService * @return 返回停止后仍然为被开始执行的任务 * @see {@link #shutdownAndAwaitTermination(ExecutorService, long, TimeUnit)} */ public static List<Runnable> shutdownAndAwaitTermination(final ExecutorService executorService) { return shutdownAndAwaitTermination(executorService, DEFAULT_AWAIT_TERMINATE_MINUTES, TimeUnit.MINUTES); } /** * 关闭{@link ExecutorService},在指定的时间内<code>awaitTermateTimeout</code>等待 * <code>executorService</code>中已经开始的任务尽量结束. 此实现参照{@link ExecutorService} * 注释中的 <code>shutdownAndAwaitTermination</code>策略 * * @param executorService * 将要被停止的{@link ExecutorService} * @param awaitTerminateTimeout * 等待时间 * @param timeUnit * awaitTerminate的单位 * @return 返回停止后任然未被开始执行的任务 */ public static List<Runnable> shutdownAndAwaitTermination(final ExecutorService executorService, final long awaitTerminateTimeout, final TimeUnit timeUnit) { List<Runnable> _left = null; executorService.shutdown(); try { boolean _terminateResult = executorService.awaitTermination(awaitTerminateTimeout, timeUnit); if (logger.isInfoEnabled()) { logger.info("[#GS.ExecutorUtil.safeShudown] [Shutdown " + executorService + " " + (_terminateResult ? "Success" : "Fail") + "]"); } if (!_terminateResult) { //再次停止 _left = executorService.shutdownNow(); if (_left != null) { for (Runnable _o : _left) { logger.warn("Left runnable :" + _o); } } _terminateResult = executorService.awaitTermination(awaitTerminateTimeout, timeUnit); if (logger.isInfoEnabled()) { logger.info("[#GS.ExecutorUtil.shutdownAndAwaitTermination] [ShutdwonNow " + executorService + " " + (_terminateResult ? "Success" : "Fail") + "]"); } } } catch (InterruptedException e) { if (logger.isErrorEnabled()) { logger.error(ErrorsUtil .error(CommonErrorLogInfo.THRAD_ERR_INTERRUPTED, "#GS.ExecutorUitl.safeShudown", "param"), e); } _left = executorService.shutdownNow(); Thread.currentThread().interrupt(); } return _left; } }