• 10.Callable与Future的应用


     1 import java.util.Random;
     2 import java.util.concurrent.Callable;
     3 import java.util.concurrent.CompletionService;
     4 import java.util.concurrent.ExecutionException;
     5 import java.util.concurrent.ExecutorCompletionService;
     6 import java.util.concurrent.ExecutorService;
     7 import java.util.concurrent.Executors;
     8 import java.util.concurrent.Future;
     9 
    10 /**
    11  * Callable与Future的应用
    12  * Future取得的结果类型和Callable返回的结果类型必须一致,这是通过泛型来实现。
    13  * Callable要采用ExecutorService的submit方法提交,返回的future对象可以取消任务。
    14  * CompletionService用于提交一组Callable任务,其take方法返回已完成的一个Callable任务对应的Future对象。
    15  * @author LiTaiQing
    16  *
    17  */
    18 public class CallableAndFuture {
    19     
    20     public static void main(String[] args) {
    21         
    22         ExecutorService threadPool = Executors.newSingleThreadExecutor();
    23         Future<String> future = 
    24         //有返回结果时用submit
    25         threadPool.submit(new Callable<String>(){
    26             @Override
    27             public String call() throws Exception {
    28                 return "Hello";
    29             }
    30             
    31         });
    32         
    33         System.out.println("等待结果");
    34         try {
    35             System.out.println("拿到结果" + future.get());
    36         } catch (InterruptedException e) {
    37             e.printStackTrace();
    38         } catch (ExecutionException e) {
    39             e.printStackTrace();
    40         }
    41         
    42         ExecutorService threadPool2 = Executors.newFixedThreadPool(10);
    43         CompletionService<Integer> completionService = new ExecutorCompletionService<Integer>(threadPool2);
    44         for(int i = 1; i < 10; i++){
    45             final int seq = i;
    46             completionService.submit(new Callable<Integer>(){
    47                 @Override
    48                 public Integer call() throws Exception {
    49                     Thread.sleep(new Random().nextInt(5000));
    50                     return seq;
    51                 }
    52                 
    53             });
    54         }
    55         
    56         for(int i = 0 ; i < 10; i++){
    57             try {
    58                 System.out.println(completionService.take().get());
    59             } catch (InterruptedException e) {
    60                 e.printStackTrace();
    61             } catch (ExecutionException e) {
    62                 e.printStackTrace();
    63             };
    64         }
    65         
    66     }
    67     
    68 }
  • 相关阅读:
    nodejs事件和事件循环详解
    keycloak集群化的思考
    Python解释器和IPython
    IndexedDB详解
    在onelogin中使用OpenId Connect Implicit Flow
    在onelogin中使用OpenId Connect Authentication Flow
    SAML和OAuth2这两种SSO协议的区别
    wildfly 21的配置文件和资源管理
    【老孟Flutter】2021 年 Flutter 官方路线图
    【老孟Flutter】为什么 build 方法放在 State 中而不是在 StatefulWidget 中
  • 原文地址:https://www.cnblogs.com/litaiqing/p/4640847.html
Copyright © 2020-2023  润新知