Java executor 多线程demo,判断多线程全部执行完成 isTerminated

发布时间:2019-01-23作者:laosun阅读(3644)

Java

executor 多线程,带多线程返回值。可判断多线程全部执行完成 isTerminated

    Java虚拟机的多线程是通过线程的轮流切换并分配处理器执行时间的方式来实现的

    多线程执行能帮程序提高执行效率,但是使用一定要合理慎重,否则后果很严重。.

    下边博主利用中午午休的时间写一个非常使用的多线程供大家参考。

    /**
     *                     .::::.
     *                   .::::::::.
     *                  :::::::::::    佛主保佑、永无Bug
     *              ..:::::::::::'
     *            '::::::::::::'
     *              .::::::::::
     *         '::::::::::::::..
     *              ..::::::::::::.
     *            ``::::::::::::::::
     *             ::::``:::::::::'        .:::.
     *            ::::'   ':::::'       .::::::::.
     *          .::::'      ::::     .:::::::'::::.
     *         .:::'       :::::  .:::::::::' ':::::.
     *        .::'        :::::.:::::::::'      ':::::.
     *       .::'         ::::::::::::::'         ``::::.
     *   ...:::           ::::::::::::'              ``::.
     *  ```` ':.          ':::::::::'                  ::::..
     *                     '.:::::'                    ':'````..
     */
    
    import com.google.common.collect.Maps;
    import com.google.common.collect.Sets;
    
    import java.util.ArrayList;
    import java.util.Map;
    import java.util.Set;
    import java.util.concurrent.*;
    
    /**
     * executor 多线程执行demo,带多线程返回值。可判断多线程全部执行完成
     * @Authror sunjs
     * @Date 2019-01-23 12:58
     */
    public class ThreadDemo {
    
        private int THREAD_NUM = 5;//启动最大线程数量
        private static Set<String> urlList = Sets.newConcurrentHashSet();//任务URL
    
        static{
            for(int i = 1;i<=20;i++){
                urlList.add("https://www.sunjs.com#"+i);
            }
        }
    
        public static void main(String[] args) {
            ThreadDemo td = new ThreadDemo();
            td.threadExecute();
        }
    
        /**
         * 多线程执行
         * @Author sunjs
         * @return void
         * @throws
         * @Date 2019-01-23 13:04
         */
        public void threadExecute(){
            //多线程
            ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUM);
            //...多种方式,具体可查阅资料了解
            //ExecutorService executor2 = Executors.newCachedThreadPool();
    
            //存储返回值
            ArrayList<Future<Map<String, String>>> resultList = new ArrayList<>();
    
            //for循环加入多线程进行执行操作
            for(String str:urlList){
                //这块使用Callable,不使用 Runnable。因为 Callable 带返回值
                Future<Map<String, String>> result = executor.submit(new Callable<Map<String, String>>() {
                    @Override
                    public Map<String, String> call() throws Exception {
                        System.out.println(Thread.currentThread().getName()+"=====>"+str);
    
                        //TODO 处理业务处理(多线程)
    
                        Map<String, String> map = Maps.newConcurrentMap();
                        map.put("threadName", Thread.currentThread().getName());
                        map.put("msg", str+"===>执行成功");
                        return map;
                    }
                });
                resultList.add(result);
                //TODO 单个线程完成处理
                try {
                    Map<String, String> map = result.get();
                    System.out.println("单个线程完成处理:"+map.get("threadName")+"====>"+map.get("msg"));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
            executor.shutdown();
            while(true){
                if(executor.isTerminated()){
                    //TODO 所有线程全部处理完成
                    System.out.println("所有线程全部处理完成,打印结果");
                    if(resultList!=null && resultList.size()>0){
                        for(Future<Map<String, String>> fm:resultList){
                            try {
                                Map<String, String> map = fm.get();
                                System.out.println(map.get("threadName")+"====>"+map.get("msg"));
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            } catch (ExecutionException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    break;
                }
                try {
                    //停歇一秒检测一次
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //多线程已经抓取完毕,程序终止或者继续执行下边的操作
            System.out.println("多线程已经抓取完毕,程序终止或者继续执行下边的操作");
        }
    
    }


    执行结果:

    pool-1-thread-1=====>https://www.sunjs.com#9
    单个线程完成处理:pool-1-thread-1====>https://www.sunjs.com#9===>执行成功
    pool-1-thread-2=====>https://www.sunjs.com#2
    单个线程完成处理:pool-1-thread-2====>https://www.sunjs.com#2===>执行成功
    pool-1-thread-3=====>https://www.sunjs.com#1
    单个线程完成处理:pool-1-thread-3====>https://www.sunjs.com#1===>执行成功
    pool-1-thread-4=====>https://www.sunjs.com#4
    单个线程完成处理:pool-1-thread-4====>https://www.sunjs.com#4===>执行成功
    pool-1-thread-5=====>https://www.sunjs.com#3
    单个线程完成处理:pool-1-thread-5====>https://www.sunjs.com#3===>执行成功
    pool-1-thread-1=====>https://www.sunjs.com#6
    单个线程完成处理:pool-1-thread-1====>https://www.sunjs.com#6===>执行成功
    pool-1-thread-2=====>https://www.sunjs.com#5
    单个线程完成处理:pool-1-thread-2====>https://www.sunjs.com#5===>执行成功
    pool-1-thread-3=====>https://www.sunjs.com#8
    单个线程完成处理:pool-1-thread-3====>https://www.sunjs.com#8===>执行成功
    pool-1-thread-4=====>https://www.sunjs.com#7
    单个线程完成处理:pool-1-thread-4====>https://www.sunjs.com#7===>执行成功
    pool-1-thread-5=====>https://www.sunjs.com#20
    单个线程完成处理:pool-1-thread-5====>https://www.sunjs.com#20===>执行成功
    pool-1-thread-1=====>https://www.sunjs.com#10
    单个线程完成处理:pool-1-thread-1====>https://www.sunjs.com#10===>执行成功
    pool-1-thread-2=====>https://www.sunjs.com#11
    单个线程完成处理:pool-1-thread-2====>https://www.sunjs.com#11===>执行成功
    pool-1-thread-3=====>https://www.sunjs.com#12
    单个线程完成处理:pool-1-thread-3====>https://www.sunjs.com#12===>执行成功
    pool-1-thread-4=====>https://www.sunjs.com#13
    单个线程完成处理:pool-1-thread-4====>https://www.sunjs.com#13===>执行成功
    pool-1-thread-5=====>https://www.sunjs.com#14
    单个线程完成处理:pool-1-thread-5====>https://www.sunjs.com#14===>执行成功
    pool-1-thread-1=====>https://www.sunjs.com#15
    单个线程完成处理:pool-1-thread-1====>https://www.sunjs.com#15===>执行成功
    pool-1-thread-2=====>https://www.sunjs.com#16
    单个线程完成处理:pool-1-thread-2====>https://www.sunjs.com#16===>执行成功
    pool-1-thread-3=====>https://www.sunjs.com#17
    单个线程完成处理:pool-1-thread-3====>https://www.sunjs.com#17===>执行成功
    pool-1-thread-4=====>https://www.sunjs.com#18
    单个线程完成处理:pool-1-thread-4====>https://www.sunjs.com#18===>执行成功
    pool-1-thread-5=====>https://www.sunjs.com#19
    单个线程完成处理:pool-1-thread-5====>https://www.sunjs.com#19===>执行成功
    所有线程全部处理完成,打印结果
    pool-1-thread-1====>https://www.sunjs.com#9===>执行成功
    pool-1-thread-2====>https://www.sunjs.com#2===>执行成功
    pool-1-thread-3====>https://www.sunjs.com#1===>执行成功
    pool-1-thread-4====>https://www.sunjs.com#4===>执行成功
    pool-1-thread-5====>https://www.sunjs.com#3===>执行成功
    pool-1-thread-1====>https://www.sunjs.com#6===>执行成功
    pool-1-thread-2====>https://www.sunjs.com#5===>执行成功
    pool-1-thread-3====>https://www.sunjs.com#8===>执行成功
    pool-1-thread-4====>https://www.sunjs.com#7===>执行成功
    pool-1-thread-5====>https://www.sunjs.com#20===>执行成功
    pool-1-thread-1====>https://www.sunjs.com#10===>执行成功
    pool-1-thread-2====>https://www.sunjs.com#11===>执行成功
    pool-1-thread-3====>https://www.sunjs.com#12===>执行成功
    pool-1-thread-4====>https://www.sunjs.com#13===>执行成功
    pool-1-thread-5====>https://www.sunjs.com#14===>执行成功
    pool-1-thread-1====>https://www.sunjs.com#15===>执行成功
    pool-1-thread-2====>https://www.sunjs.com#16===>执行成功
    pool-1-thread-3====>https://www.sunjs.com#17===>执行成功
    pool-1-thread-4====>https://www.sunjs.com#18===>执行成功
    pool-1-thread-5====>https://www.sunjs.com#19===>执行成功
    多线程已经抓取完毕,程序终止或者继续执行下边的操作


1 +1

版权声明

 Java  源码  多线程

 请文明留言

1 条评论