public class MyCallableTask implements Callable<String> {
int i;
public MyCallableTask(int i) {
this.i = i;
}
@Override
public String call() throws Exception {
Thread.sleep(1000);
return Thread.currentThread().getName() + "_i = " + i;
}
}
public class CallableDemo {
private static final int CORE_POOL_SIZE = 5;
private static final int MAX_POOL_SIZE = 10;
private static final int QUEUE_CAPACITY = 100;
private static final Long KEEP_ALIVE_TIME = 1L;
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(
CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_ALIVE_TIME,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(QUEUE_CAPACITY),
new ThreadPoolExecutor.CallerRunsPolicy());
List<Future<String>> futureList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Callable<String> callable = new MyCallableTask(i);
Future<String> future = executor.submit(callable);
futureList.add(future);
}
for (Future<String> future : futureList) {
try {
System.out.println(future.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
executor.shutdown();
}
}
pool-1-thread-1_i = 0
pool-1-thread-2_i = 1
pool-1-thread-3_i = 2
pool-1-thread-4_i = 3
pool-1-thread-5_i = 4
pool-1-thread-3_i = 5
pool-1-thread-2_i = 6
pool-1-thread-1_i = 7
pool-1-thread-5_i = 8
pool-1-thread-4_i = 9
Process finished with exit code 0