The example of Using Executors

来源:互联网 发布:java闰年的判断 编辑:程序博客网 时间:2024/04/30 13:36

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;}@Overridepublic 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 2011syncRes Before getDone = @Mon Nov 21 10:48:41 CST 2011syncRes UnDone = @Mon Nov 21 10:48:41 CST 2011syncRes UnDone = @Mon Nov 21 10:48:42 CST 2011syncRes UnDone = @Mon Nov 21 10:48:43 CST 2011syncRes UnDone = @Mon Nov 21 10:48:44 CST 2011syncRes UnDone = @Mon Nov 21 10:48:45 CST 2011syncRes UnDone = @Mon Nov 21 10:48:46 CST 2011syncRes UnDone = @Mon Nov 21 10:48:47 CST 2011oneSync finished:Mon Nov 21 10:48:47 CST 2011twoSync finished:Mon Nov 21 10:48:47 CST 2011syncRes=OK @Mon Nov 21 10:48:48 CST 2011syncRes=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 2011oneSync finished:Mon Nov 21 10:48:47 CST 2011twoSync finished:Mon Nov 21 10:48:47 CST 2011syncRes=OK @Mon Nov 21 10:48:48 CST 2011syncRes=OK @Mon Nov 21 10:48:48 CST 2011

原创粉丝点击