JAVA多线程问题,一个神奇的问题,请大神指导一下~~~~~

2010带你飞 发布于 2018/05/31 14:31
阅读 155
收藏 1

需求可以不看~~~~~

目前的需求是:部分功能需要通过多线程来执行任务,主线程阻塞,等待子线程全部执行完成后主线程再获得所有子线程结果来返回总结果。目前我已经通过ExecutorService和CountDownLatch两种方式实现了上述功能,但是需要可以将方法抽出来做工具类方便其他人使用,但是抽出后遇到一下问题。

 

public static Map<String, Object> moreThreadByPool(List<Runnable> runnableList,int threadPoolCount){
        Map<String, Object> resultMap = new HashMap<String,Object>();
        try {
            //Executors 中newFixedThreadPool类型线程:
            //核心特点是大于当前线程则等待之前的线程执行完再执行。
            //核心缺点:每次都会重新新建线程,相对而言消耗性能。
            ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(threadPoolCount);
            //使用线程池执行业务代码
            for (int i = 0; i < runnableList.size(); i++) {
                //多线程执行代码
                newFixedThreadPool.execute(runnableList.get(i));
            }
            //关闭线程池 
            newFixedThreadPool.shutdown();
            //等待所有子线程全部执行完
            newFixedThreadPool.awaitTermination(1, TimeUnit.HOURS);
            resultMap.put("resultCode", 100);
            resultMap.put("resultMsg", "多线程执行完成");
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("resultCode", 101);
            resultMap.put("resultMsg", "多线程执行异常:" + e.getMessage());
        }
        return resultMap;
    }

//测试方法

    public static void main(String[] args) throws InterruptedException {
        System.out.println("线程启动");
        List<String> resultList = new ArrayList<String>();
        //存放多线程业务
        List<Runnable> runnableList = new ArrayList<Runnable>();
        for (int i = 0; i < 10; i++) {
            final int flag = i;
            Runnable thread = new Runnable() {
                @Override
                public void run() {
                    resultList.add("线程:" + flag);
                    System.out.println("线程:" + flag);
                }
            };
            runnableList.add(thread);
        }

        moreThreadByPool(runnableList,100);
        System.out.println(resultList);
    }

 

 

测试结果输出:

 

问题就出在为什么第一个是null?在多次测试中发现 null有时候是一个有时候是多个,有时候又全部正常一个null都没有,而且发现当出现一个null时,肯定有个线程没有加入到list中,比如图片中的线程:0 就没有加入进去,但是从最上面的system.out输出来看,线程0也是执行了,百思不得其解~~~~~请大家指导一下

加载中
0
一只小桃子
一只小桃子

arrayList换成vector

2010带你飞
2010带你飞
感谢,确实可以了。原来这个地方要用线程安全的Vector才行,谢谢。
返回顶部
顶部