使用Java Concurrency思考angular的$ q.all

时间:2017-04-05 10:19:26

标签: javascript java angularjs concurrency angular-promise

在Angular.js库中,我们有一个api $ q,

$ q.all()接受promise数组,即

gvGetData.CurrentCell = dgvGetData.Rows[rowIndex].Cells[2];
                            dgvGetData.CurrentRow.Selected = false;

只有在解析了参数中传递的所有promise之后才解决回调函数,

正如您在下面的代码中看到的那样,

$q.all([promise1,promise2,....,promiseN]).then(function);

上述代码的输出是,

        <script type="text/javaScript">
        angular.module("myApp",[]);
        angular.module("myApp").controller("myCtrl",myCtrl);
        angular.module("myApp").factory("demoService",demoService);

        myCtrl.$inject = ["$scope","demoService","$q"];
        demoService.$inject = ["$q","$timeout"];

        function myCtrl($scope,demoService,$q){
            $scope.message = "All promises";

            $scope.init = init;


            function invokedAll(){
                var promises = [demoService.get(1),
                                demoService.get(2),
                                demoService.get(3),
                                demoService.get(4),
                                demoService.get(5),
                                demoService.get(6),
                                demoService.get(7),
                                demoService.get(8),
                                demoService.get(9),
                                demoService.get(10)];

                return $q.all(promises);                
            } //invokedAll

            function init(){
                invokedAll().then(function(){
                    console.log(" Data loaded successfully ");
                });
            }
        }

        function demoService($q,$timeout){
            var TIMEOUT = 2000; // 5 seconds
            return {
                get : function(messageNo){
                    TIMEOUT += 1000;
                    var deferred = $q.defer();
                    $timeout(function(){
                        console.log("data loaded "+messageNo);
                        deferred.resolve("success");
                    },TIMEOUT);

                    return deferred.promise;
                }
            };
        }   
    </script>
    <body ng-controller="myCtrl" ng-init="init()">

您可以看到,只有在所有承诺得到解决后才会打印最后一行。

我尝试在java中实现上述功能,

我正在使用ExecuterService api在threadpool中执行任务。

执行完所有任务后,调用最终任务。

代码如下,

data loaded 1
data loaded 2
data loaded 3
data loaded 4
data loaded 5
data loaded 6
data loaded 7
data loaded 8
data loaded 9
data loaded 10
Data loaded successfully

在上面的java代码中,您可以看到,

方法'tasks'使用'callable'实例创建3个任务, 并且使用ExecuterService的“invokeAll”方法调用所有3个任务。

执行完所有任务后,将在main方法中调用最终的Future实例,并返回true,

上面java代码的输出如下,

 package executerService.example01;

 public class Example05 {
   private static final int POOL_COUNT = 10;

   private static void tasks() throws Exception{
      ExecutorService service = null;
      Set<Callable<Integer>> callables = null;
      List<Future<Integer>> futures = null;

      service = Executors.newFixedThreadPool(POOL_COUNT);

      callables = new HashSet<Callable<Integer>>();

      callables.add(new Callable<Integer>() {

        @Override
        public Integer call() throws Exception {
            int taskNo = 1;
            System.out.println(Thread.currentThread().getName()+", TASK-NO "+taskNo);
            return taskNo;
        }

      });

      callables.add(new Callable<Integer>() {

        @Override
        public Integer call() throws Exception {
            int taskNo = 2;
            System.out.println(Thread.currentThread().getName()+", TASK-NO "+taskNo);
            return taskNo;
        }

     });

     callables.add(new Callable<Integer>() {

        @Override
        public Integer call() throws Exception {
            int taskNo = 3;
            System.out.println(Thread.currentThread().getName()+", TASK-NO "+taskNo);
            return taskNo;
        }

     });


    futures = service.invokeAll(callables);


    for(Iterator<Future<Integer>> itr = futures.iterator(); itr.hasNext();){
        System.out.println("Execution of Task No "+itr.next().get()+" completed");
    }
  } //end of method task


  public static void main(String [] args){
      ExecutorService service = null;
      Future<Boolean> future = null;
      try{          
        service = Executors.newSingleThreadExecutor();

        future = service.submit(new Callable<Boolean>() {

            @Override
            public Boolean call() throws Exception {
                tasks();
                return true;
            }

        });

        if(future.get()){
            System.out.println("All the tasks are executed");
        }
      }catch(Exception e){
        e.printStackTrace();
      }
  } // end of main method
}

我的问题是

我是否能够实现angular.js的'$ q.all()'的相同行为 在Java中使用'ExecuterService.invokeAll()'和'Future.get()'?

如果我的理解是写的,请指导我。

另请告诉我,Java中的上述实现是否正确或是否可以以不同方式实现。

0 个答案:

没有答案