In one thread invokes other threads to do computations. ExecutorService.InvokeAll() would block the result,直到所有的task都complete(或者正常结束,时间到,或者抛出异常),最后返回一个Future Task List, 所以这个List中的Future Taks中的isDone都是true,而InvokeAny只要一个成功完成了就会返回,其他的task将会被取消,注意这里和invokeAll的不同点,invokeALL是判断task完成是包含有异常抛出的情况的,而invokeAny只会收到任务成功完成一个的情况而异常抛出情况不算, while the ExecutorService.submit() would not.
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestFuture {
/**
* @param args
*/
public static void main(String[] args) {
TestFuture fu=new TestFuture();
fu.syncData();
}
public void syncData(){
try {
ExecutorService executor =Executors.newCachedThreadPool();
SyncAction one=new SyncAction("oneSync");
SyncAction two=new SyncAction("twoSync");
System.out.println("syncRes Before submit = @"+new Date(System.currentTimeMillis()));
Future<String> futureOne = executor.submit(one);
Future<String> futureTwo = executor.submit(two);
// List<Future<String>> futures= executor.invokeAll(syncTasks);
ArrayList<Future<String>> syncTasks=new ArrayList< Future<String>>();
syncTasks.add(futureOne);
syncTasks.add(futureTwo);
System.out.println("syncRes Before getDone = @"+new Date(System.currentTimeMillis()));
for(Future<String> aFu: syncTasks){
while(!aFu.isDone()){
System.out.println("syncRes UnDone = @"+new Date(System.currentTimeMillis()));
Thread.sleep(1000);
}
if(aFu.isDone()){
String syncRes=aFu.get();
System.out.println("syncRes="+syncRes+" @"+new Date(System.currentTimeMillis()));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private class SyncAction implements Callable<String>{
private String name;
public SyncAction(String name) {
super();
this.name = name;
}
@Override
public String call() throws Exception {
int i=0;
while(i<3){
Thread.sleep(2000);
i++;
}
System.out.println(name+" finished:"+new Date(System.currentTimeMillis()));
return "OK";
}
}
}
syncRes Before submit = @Mon Nov 21 10:48:41 CST 2011
syncRes Before getDone = @Mon Nov 21 10:48:41 CST 2011
syncRes UnDone = @Mon Nov 21 10:48:41 CST 2011
syncRes UnDone = @Mon Nov 21 10:48:42 CST 2011
syncRes UnDone = @Mon Nov 21 10:48:43 CST 2011
syncRes UnDone = @Mon Nov 21 10:48:44 CST 2011
syncRes UnDone = @Mon Nov 21 10:48:45 CST 2011
syncRes UnDone = @Mon Nov 21 10:48:46 CST 2011
syncRes UnDone = @Mon Nov 21 10:48:47 CST 2011
oneSync finished:Mon Nov 21 10:48:47 CST 2011
twoSync finished:Mon Nov 21 10:48:47 CST 2011
syncRes=OK @Mon Nov 21 10:48:48 CST 2011
syncRes=OK @Mon Nov 21 10:48:48 CST 2011
if use List<Future<String>> futures= executor.invokeAll(syncTasks); the result would be this
syncRes Before submit = @Mon Nov 21 10:48:41 CST 2011
oneSync finished:Mon Nov 21 10:48:47 CST 2011
twoSync finished:Mon Nov 21 10:48:47 CST 2011
syncRes=OK @Mon Nov 21 10:48:48 CST 2011
syncRes=OK @Mon Nov 21 10:48:48 CST 2011