ThreadPoolExecutor多线程执行callable,FutureTask获取返回值
定义callable类
public class MyThread implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int i = new Random().nextInt(100);
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"任务执行结果"+i);
return i;
}
}
测试代码
public class ThreadTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 任务集合
List<FutureTask<Integer>> futureTasks = new ArrayList<FutureTask<Integer>>();
// 线程池
ThreadPoolExecutor pool = new ThreadPoolExecutor(4, 8, 4L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(5 ), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
long start = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
FutureTask<Integer> task = new FutureTask<>(new MyThread());
futureTasks.add(task);
pool.submit(task);
}
Integer count = 0;
for (FutureTask<Integer> futureTask : futureTasks) {
count += futureTask.get();
}
long end = System.currentTimeMillis();
System.out.println("线程池计算完成,结果为"+count+"耗时"+(end-start)+"ms");
pool.shutdown();
// Runnable runnable = ()->{
// for (int i = 0; i < 10; i++) {
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println("线程"+i);
// }
// };
// new Thread(runnable).start();
// 重试工具
// Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
// .retryIfException()
// .retryIfResult(Predicates.equalTo(Boolean.FALSE))
// .withWaitStrategy(WaitStrategies.fixedWait(10, TimeUnit.SECONDS))
// .withStopStrategy(StopStrategies.stopAfterAttempt(3))
// .build();
// try {
// retryer.call(new MyThread01());
// } catch (Exception e) {
// e.printStackTrace();
// }
}
}