美文网首页
CompletionService用法

CompletionService用法

作者: endlesswork | 来源:发表于2022-05-22 23:44 被阅读0次
    public class CompletionServiceDemo {
    
        public static class FutureTaskDemo implements Callable<String>{
    
            private String name;
    
            private Long time;
    
            public FutureTaskDemo(String name, Long time){
                this.name = name;
                this.time = time;
            }
    
            @Override
            public String call() {
                System.out.printf("子线程 %s 开始: %s \n", name, getDate());
                try {
                    Thread.sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.printf("子线程 %s 结束: %s \n", name, getDate());
                return name;
            }
        }
    
        public static String getDate(){
            Date date = new Date();
            SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
            return  dateFormat.format(date);
        }
    
        public static void main(String []args){
            System.out.printf("程序开始: %s \n", getDate());
            ExecutorService executorService = new ThreadPoolExecutor(5, 5,
                    1L, TimeUnit.MILLISECONDS,
                    new LinkedBlockingQueue<>());
            CompletionService<String> completionService = new ExecutorCompletionService<>(executorService);
            completionService.submit(new FutureTaskDemo("c0", 2000L));
            completionService.submit(new FutureTaskDemo("c1", 1000L));
            completionService.submit(new FutureTaskDemo("c2", 4000L));
            completionService.submit(new FutureTaskDemo("c3", 5000L));
            completionService.submit(new FutureTaskDemo("c4", 3000L));
            System.out.printf("开始获取结果: %s \n", getDate());
            for(int i=0; i<5; i++){
                System.out.printf("循环开始 %s, 时间: %s \n", i, getDate());
                String result = null;
                try {
                    result = completionService.take().get();
                } catch (InterruptedException| ExecutionException e) {
                    e.printStackTrace();
                }
                System.out.printf("=====子线程 %s 结束: %s \n", result, getDate());
            }
            executorService.shutdown();
            System.out.printf("程序结束: %s \n", getDate());
    
        }
    
    }
    

    结果如下

    程序开始: 2022-05-22 :11:10:25 
    子线程 c1 开始: 2022-05-22 :11:10:25 
    子线程 c3 开始: 2022-05-22 :11:10:25 
    子线程 c2 开始: 2022-05-22 :11:10:25 
    子线程 c0 开始: 2022-05-22 :11:10:25 
    开始获取结果: 2022-05-22 :11:10:25 
    子线程 c4 开始: 2022-05-22 :11:10:25 
    循环开始 0, 时间: 2022-05-22 :11:10:25 
    子线程 c1 结束: 2022-05-22 :11:10:26 
    =====子线程 c1 结束: 2022-05-22 :11:10:26 
    循环开始 1, 时间: 2022-05-22 :11:10:26 
    子线程 c0 结束: 2022-05-22 :11:10:27 
    =====子线程 c0 结束: 2022-05-22 :11:10:27 
    循环开始 2, 时间: 2022-05-22 :11:10:27 
    子线程 c4 结束: 2022-05-22 :11:10:28 
    =====子线程 c4 结束: 2022-05-22 :11:10:28 
    循环开始 3, 时间: 2022-05-22 :11:10:28 
    子线程 c2 结束: 2022-05-22 :11:10:29 
    =====子线程 c2 结束: 2022-05-22 :11:10:29 
    循环开始 4, 时间: 2022-05-22 :11:10:29 
    子线程 c3 结束: 2022-05-22 :11:10:30 
    =====子线程 c3 结束: 2022-05-22 :11:10:30 
    程序结束: 2022-05-22 :11:10:30 
    

    相关文章

      网友评论

          本文标题:CompletionService用法

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