import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class Main {
static int MAX_THREADS = 10;
public static void main(String[] args) throws Exception {
System.out.println("Thread pool size = " + MAX_THREADS);
ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
Future previousFuture = null;
for (int i = 0; i < MAX_THREADS; i++) {
JobRunnable job = new JobRunnable(i, previousFuture);
previousFuture = executor.submit(job);
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
System.out.println("Program done.");
}
}
class JobRunnable implements Runnable {
int _lineIdx;
Future f;
public JobRunnable(int lineIdx, Future previousFuture) {
_lineIdx = lineIdx;
f = previousFuture;
}
public void run() {
try {
Thread.sleep(1000);
String currentThreadName = Thread.currentThread().getName();
System.out.println("Thread " + currentThreadName
+ " is done with its work on line " + _lineIdx);
if (f != null) {
System.out.println("Thread " + currentThreadName
+ " will wait for future " + f + " before printing its results.");
f.get();
}
System.out.println("RESULT: " + _lineIdx + " (Printed on Thread "
+ currentThreadName + ")");
} catch (Exception e) {
e.printStackTrace();
}
}
}