| package com.ruoyi.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 ruoyi | 
|  */ | 
| 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); | 
|         } | 
|     } | 
| } |