美文网首页
解决 ThreadPoolExecutor

解决 ThreadPoolExecutor

作者: 无尾君 | 来源:发表于2018-11-09 17:28 被阅读0次

    1、任务开始,线程池为空;


    image.png

    2、先后有7个任务加入到线程池中,正在运行1个,已完成6个


    image.png

    3、关闭其他线程,关闭线程池


    image.png

    4、初始化,初始化线程池


    image.png

    5、不! 这不是线程池的初始化! 而是对三个任务进行计数! COUNT_LIST 用来当作计数器容器。


    image.png

    [图片上传中...(image.png-fd5528-1541751268686-0)]

    6、找到了这个静态ExecutorService,下面需要将其变为非静态的,每次初始化都new一个新的线程池
    [图片上传中...(image.png-f90f73-1541751404191-0)]

    7、将其变为非静态属性
    [图片上传中...(image.png-bba0d0-1541751756414-0)]

    8、新增线程池初始化代码


    image.png

    9、测试,再来看 ES , completed tasks = 0 了, 线程池初始化成功


    image.png

    10、新问题,处理了 0 条数据 (应>0) 。
    只是依赖最后一个线程的结束来确定程序的结束, 导致前置线程异常关闭


    image.png
    public void start(List<Triplet> taskList) {
            try {
                for (int i = 0; i < taskList.size(); i++) {
                    int sum = Integer.parseInt(taskList.get(i).getThread().toString());
                    for (int k = 0; k < sum; k++) {
                        ES.execute((Runnable) taskList.get(i).getTask());
                    }
    
                    // 这里,我需要确保前置线程执行完毕后再关闭主线程
                    try {
                        if (i == (taskList.size() - 1) && null != taskList.get(i).getSignal()) {
                            ((CountDownLatch) taskList.get(i).getSignal()).await();
                        }
    
                    } catch (InterruptedException e) {
                        LOGGER.error(e.getMessage());
    
                    }
                }
    
            } catch (Exception e) {
                LOGGER.error(e.getMessage());
            } finally {
                DIVIDE_DONE_SIGNAL.countDown();
                EXTRACTION_DONE_SIGNAL.countDown();
                ES.shutdown();
            }
        }
    

    11、这里有三个任务,前两个任务用来处理数据,最后一个任务用来写入数据库。在加注释的 try内,添加判断条件,当前两个任务都关闭后,才执行 任务3 的关闭。

    image.png
    image.png

    。。。。。。

    12、启动程序,第一次是成功的,后面都是失败。还有其他属性没有被初始化, 队列!用于进程间读写的阻塞队列! 在设置中,线程的结束是按照初始传入的数据条数来判断的,所以队列里的数据会越来越多


    [图片上传中...(image.png-5d52db-1541753335885-0)]

    13、三个线程


    image.png

    14、查看三个线程获取到的值,另外两个线程是 null , 但是,当判断为null时, 又向队列插入了两个空值


    image.png
    image.png

    15、删除 else ,测试, 还是 0


    image.png

    16、计数器未初始化!


    image.png

    17、使计数器可被实例化 , finished !
    [图片上传中...(image.png-e28ab4-1541755586886-0)]


    总结:根据项目需求,修改原有代码;忽略了在分布式环境下的很多问题;代码基础薄弱,还需巩固提高。

    相关文章

      网友评论

          本文标题:解决 ThreadPoolExecutor

          本文链接:https://www.haomeiwen.com/subject/yweoxqtx.html