FutureTask 类构造函数参数为 Callable 接口,实现 RunnableFuture 接口,而 RunnableFuture 接口继承了 Future 和 Runnable 接口,
所以它既是一个线程,也可以有返回结果。
使用栗子如下:
1)定义一个Callable 任务
public class CallableTask implements Callable<String> { private long sleepTime; public CallableTask(long sleepTime){ this.sleepTime = sleepTime; } @Override public String call() throws Exception { TimeUnit.SECONDS.sleep(sleepTime); return Thread.currentThread().getName(); } }
2)定义线程池,执行 Callable 任务,使用 FutureTask 接收 Callable任务返回对象信息。
public class FutureTaskTest { public static void main(String[] args) { CallableTask callable1 = new CallableTask(3L); CallableTask callable2 = new CallableTask(5L); FutureTask<String> futureTask1 = new FutureTask<String>(callable1); FutureTask<String> futureTask2 = new FutureTask<String>(callable2); ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(futureTask1); executor.execute(futureTask2); while (true) { try { if (futureTask1.isDone() && futureTask2.isDone()){ System.out.println("FutureTask1:" + futureTask1.get()); System.out.println("FutureTask2:" + futureTask2.get()); System.out.println("All FutureTasks are finished"); executor.shutdown(); return; } } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } } }