import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ExecutorService;
public class Concurrency {
public static void main(String args[]) {
long start = System.currentTimeMillis();
// initialize pool
ExecutorService pool = Executors.newFixedThreadPool(3);
// store futures somewhere
List<Future<CallableData>> futures = new ArrayList<Future<CallableData>>();
// submit a bunch of Callables to the Pool
for(int i = 0; i < 10; i++) {
System.out.println("Creating! " + i);
futures.add(pool.submit(new CallableData(i)));
}
// wait for everything to finish
for(Future<CallableData> future : futures) {
try {
CallableData data = future.get();
System.out.println("Got result!" + data.getFoo());
} catch (Exception e){
e.printStackTrace();
}
}
System.out.println("Total time: " + (System.currentTimeMillis() - start) + " ms");
// don't forget to shutdown
pool.shutdown();
}
private static class CallableData implements Callable<CallableData> {
private int foo;
public CallableData(int foo) {
this.foo = foo;
}
public CallableData call() {
System.out.println("Running! " + foo);
try { Thread.sleep(2000); } catch (Exception e) {}
foo = foo + 1000;
System.out.println("Completed! " + foo);
return this;
}
public int getFoo() {
return foo;
}
}
}
No comments:
Post a Comment