java线程池工具类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/heihu_malice7/article/details/85334427
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 线程池基础类
 */
public class ThreadPoolUtil {  
      
   /**
    * 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
    * 即:相当于FixedThreadPool(1)
    * 注:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。
    * 如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。
    * 此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
    */
    public static ExecutorService getSingleThread(){
        ExecutorService exec = Executors.newSingleThreadExecutor();
        return exec;  
    }  
      
    /**
     * 创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
     * 线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
     */
    public static ExecutorService getFixedThreadPool(int count){
        ExecutorService exec = Executors.newFixedThreadPool(count);
        return exec;  
    }  
      
    /**
     * 创建一个定长线程池,支持定时及周期性任务执行
     */
    public static ExecutorService getScheduledThreadPool(int count){
        ExecutorService exec = Executors.newScheduledThreadPool(count);
        return exec;  
    }  
      
    /**
     * 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
     * 即:可变大小线程池,按照任务数来分配线程
     */
    public static ExecutorService getCachedThreadPool(){
        ExecutorService exec = Executors.newCachedThreadPool();
        return exec;  
    }

    /**
     * 结束线程时调用,一定要调用这个方法,不然executorService.isTerminated()永远不为true
     * @param executor
     * @throws Exception
     */
    public static void endThread(ExecutorService executor) throws Exception {
        TimeUnit.MILLISECONDS.sleep(1000);
        executor.shutdown();//关闭线程池
        while (true) {
            if (executor.isTerminated()) {
                System.out.println(getClassName()+"******************所有的子线程都结束了********************");
                break;
            }
            TimeUnit.MILLISECONDS.sleep(200);
        }

    }

    /**
     * 获取调用静态类的类名
     */
    private static String getClassName() {
        return new SecurityManager() {
            public String getClassName() {
                return getClassContext()[3].getName();
            }
        }.getClassName();
    }
}  

猜你喜欢

转载自blog.csdn.net/heihu_malice7/article/details/85334427
今日推荐