zoukankan      html  css  js  c++  java
  • ThreadPoolExecutor 中的 shutdown() 、awaitTermination() 、 shutdownNow() 的用法

    shutdown和awaitTermination为接口ExecutorService定义的两个方法,一般情况配合使用来关闭线程池。

    方法简介
    shutdown方法:将线程池状态置为SHUTDOWN。平滑的关闭ExecutorService,当此方法被调用时,ExecutorService停止接收新的任务并且等待已经提交的任务(包含提交正在执行和提交未执行)执行完成。当所有提交任务执行完毕,线程池即被关闭。

    awaitTermination方法:接收人timeout和TimeUnit两个参数,用于设定超时时间及单位。当等待超过设定时间时,会监测ExecutorService是否已经关闭,若关闭则返回true,否则返回false。一般情况下会和shutdown方法组合使用。

    shutdownNow方法:将线程池状态置为STOP。跟shutdown()一样,先停止接收外部提交的任务,忽略队列里等待的任务,尝试将正在跑的任务interrupt中断,返回未执行的任务列表。

    具体实例1
    普通任务处理类:

    package com.secbro.test.thread;
    
    import java.util.concurrent.Callable;
    
    /**
     * @author zhuzhisheng
     * @Description
     * @date on 2016/6/1.
     */
    public class Task implements Callable{
        @Override
        public Object call() throws Exception {
            System.out.println("普通任务");
            return null;
        }
    }

    长时间任务处理类:

    package com.secbro.test.thread;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author zhuzhisheng
     * @Description
     * @date on 2016/6/1.
     */
    public class LongTask implements Callable{
        @Override
        public Object call() throws Exception {
            System.out.println("长时间任务");
            TimeUnit.SECONDS.sleep(5);
            return null;
        }
    }

    测试类:

    package com.secbro.test.thread;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    /**
     * @author zhuzhisheng
     * @Description
     * @date on 2016/6/1.
     */
    public class TestShutDown {
    
        public static void main(String[] args) throws InterruptedException{
            ScheduledExecutorService service = Executors.newScheduledThreadPool(4);
    
            service.submit(new Task());
            service.submit(new Task());
            service.submit(new LongTask());
            service.submit(new Task());
    
    
            service.shutdown();
    
            while (!service.awaitTermination(1, TimeUnit.SECONDS)) {
                System.out.println("线程池没有关闭");
            }
    
            System.out.println("线程池已经关闭");
        }
    
    }

    输出结果为:

    普通任务
    普通任务
    长时间任务
    普通任务
    线程池没有关闭
    线程池没有关闭
    线程池没有关闭
    线程池没有关闭
    线程池已经关闭

    具体实例2

    public class ThreadPoolHelper {
    
        private static final Logger logger = Logger.getLogger(ThreadPoolHelper.class);
    
        private static final int POOL_SIZE = 40;//线程池大小
    
        //订单任务线程池
    
        private static ThreadPoolExecutor comitTaskPool =(ThreadPoolExecutor) new ScheduledThreadPoolExecutor(POOL_SIZE,
                new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
    
    
        /**
         * 执行订单任务
         *
         * @param comitTask
         */
        public static void executeTask(Runnable comitTask) {
            comitTaskPool.execute(comitTask);
            logger.debug("【线程池任务】线程池中线程数:" + comitTaskPool.getPoolSize());
            logger.debug("【线程池任务】队列中等待执行的任务数:" + comitTaskPool.getQueue().size());
            logger.debug("【线程池任务】已执行完任务数:" + comitTaskPool.getCompletedTaskCount());
        }
    
    
        /**
         * 关闭线程池
         */
        public static void shutdown() {
            logger.debug("shutdown comitTaskPool...");
            comitTaskPool.shutdown();
            try {
                if (!comitTaskPool.isTerminated()) {
                    logger.debug("直接关闭失败[" + comitTaskPool.toString() + "]");
                    comitTaskPool.awaitTermination(3, TimeUnit.SECONDS);
                    if (comitTaskPool.isTerminated()) {
                        logger.debug("成功关闭[" + comitTaskPool.toString() + "]");
                    } else {
                        logger.debug("[" + comitTaskPool.toString() + "]关闭失败,执行shutdownNow...");
                        if (comitTaskPool.shutdownNow().size() > 0) {
                            logger.debug("[" + comitTaskPool.toString() + "]没有关闭成功");
                        } else {
                            logger.debug("shutdownNow执行完毕,成功关闭[" + comitTaskPool.toString() + "]");
                        }
                    }
                } else {
                    logger.debug("成功关闭[" + comitTaskPool.toString() + "]");
                }
            } catch (InterruptedException e) {
                logger.warn("接收到中断请" + comitTaskPool.toString() + "停止操作");
            }
        }
    }
    应对软件变化
  • 相关阅读:
    MVC3分页
    ASP.NET MVC导入excel到数据库,下载文件
    使用JS获取客户端MAC地址
    关于mschart控件在mvc项目中的webform里面显示不出图片的问题
    difference between "on" and "where" when using left/right join query
    Will static methods over multithreading cause threadsafe problem?
    const VS readonly in detail
    一个编码引发js错误的问题
    分享一个基于FileSystemWatcher的文件自动备份程序
    Back/Forward and Refresh in browser
  • 原文地址:https://www.cnblogs.com/windpoplar/p/10545803.html
Copyright © 2011-2022 走看看