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

2010带你飞 发布于 2018/05/31 15:36
阅读 566
收藏 0

需求可以不看~~~~~

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

public static Map<String, Object> moreThread(List<Runnable> runnableList,int threadPoolMaxCount){
        Map<String, Object> resultMap = new HashMap<String,Object>();
        //需要执行的线程数
        int threadCount = runnableList.size();
        try {
            CountDownLatch latch = new CountDownLatch(threadCount);
            for (int i = 0; i < threadCount; i++) {
                final int flag = i;
                try {
                    //启动子线程
                    new Thread(runnableList.get(i)).start();
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("子线程运行异常:" + e.getMessage());
                }
            }
            latch.await();
            resultMap.put("resultCode", 100);
            resultMap.put("resultMsg", "子线程执行完成");
        } catch (Exception e) {
            e.printStackTrace();
            resultMap.put("resultCode", 100);
            resultMap.put("resultMsg", "多线程执行异常:" + e.getMessage());
        }
        return resultMap;
    }

 

/**
     * 测试类
     * @param args
     * @throws InterruptedException 
     */
    public static void main(String[] args) throws InterruptedException {
        System.out.println("线程启动");
        List<String> resultList = new Vector<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);

                    //latch.countDown(); //正常情况应该有这个代码,但是因为抽出来了无法拿到latch类
                }
            };
            runnableList.add(thread);
        }
        moreThread(runnableList,100);
        System.out.println(resultList);
    }

 

@一只小桃子    麻烦帮忙看看,因为我把业务代码抽出来了,所以在run方法里面没办法写latch.countDown()了,请问有啥办法解决吗?

加载中
0
tangzhanxiang
tangzhanxiang
封装一个runable 把countdown传进来啊
2010带你飞
2010带你飞
如果我把countdown也通过传入的方式,那么我想抽出来的的业务方法就基本没有什么意义了,因为要在new CountDown写在业务代码里面了,有些违背我的意愿
0
一只小桃子
一只小桃子

不用Runable啊,写个Thread子类,有一个countdownLatch属性

2010带你飞
2010带你飞
大佬,求代码科普
0
诗在远方
诗在远方

https://blog.csdn.net/zhutulang/article/details/48504487 参考这个

2010带你飞
2010带你飞
受到一点启发,感谢。
0
2010带你飞
2010带你飞

哎,还是没明白,~~~~~~latch.countDown();  这个不知道有没有啥反射的方式来处理~~~~~~不希望在业务代码里面看到这行代码

0
moyiguke
moyiguke

感觉功能写复杂了。ThreadPool了解一下。可以参考:

ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        List<Runnable> runnableList = new ArrayList<>();
        IntStream.range(0,10).forEach(i->{
            runnableList.add(new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("step into  thread "+i +" ");
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        });
        Instant start = Instant.now();
        List<Future> futures  = new ArrayList<>();
        //TODO fill runnableList
        runnableList.forEach(runnable->{

            Future<?> submit = executorService.submit(runnable);
            futures.add(submit);
        });
        Instant calculateBackend = Instant.now();
        futures.forEach(future -> {
            try {
                future.get();//这里将阻塞线程
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        });

        Instant calculateSucceed = Instant.now();

        Duration between = Duration.between(start, calculateSucceed);
        System.out.println("fin in" +between.toMillis());

 

0
不大不小开发
不大不小开发

ForkJoinTask 了解一下

0
不大不小开发
不大不小开发

大概思路,跟你需求十分吻合

0
lkclkc888
lkclkc888

https://gitee.com/lkclkc88/asload 自己看

返回顶部
顶部