在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中的上述实现是否正确或是否可以以不同方式实现。