package com.jcdm.common.utils; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 线程相关工具类. * * @author jc */ public class Threads { private static final Logger logger = LoggerFactory.getLogger(Threads.class); /** * sleepç‰å¾…,å•ä½ä¸ºæ¯«ç§’ */ public static void sleep(long milliseconds) { try { Thread.sleep(milliseconds); } catch (InterruptedException e) { return; } } /** * åœæ¢çº¿ç¨‹æ± * 先使用shutdown, åœæ¢æŽ¥æ”¶æ–°ä»»åŠ¡å¹¶å°è¯•å®Œæˆæ‰€æœ‰å·²å˜åœ¨ä»»åŠ¡. * 如果超时, 则调用shutdownNow, å–消在workQueueä¸Pending的任务,并ä¸æ–所有阻塞函数. * 如果ä»ç„¶è¶…時,則強制退出. * å¦å¯¹åœ¨shutdown时线程本身被调用ä¸æ–åšäº†å¤„ç†. */ public static void shutdownAndAwaitTermination(ExecutorService pool) { if (pool != null && !pool.isShutdown()) { pool.shutdown(); try { if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { pool.shutdownNow(); if (!pool.awaitTermination(120, TimeUnit.SECONDS)) { logger.info("Pool did not terminate"); } } } catch (InterruptedException ie) { pool.shutdownNow(); Thread.currentThread().interrupt(); } } } /** * 打å°çº¿ç¨‹å¼‚å¸¸ä¿¡æ¯ */ public static void printException(Runnable r, Throwable t) { if (t == null && r instanceof Future<?>) { try { Future<?> future = (Future<?>) r; if (future.isDone()) { future.get(); } } catch (CancellationException ce) { t = ce; } catch (ExecutionException ee) { t = ee.getCause(); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); } } if (t != null) { logger.error(t.getMessage(), t); } } }