Future用于表示异步操作的结果。它带有检查异步操作是否完成,获取计算结果等的方法。
而且,cancel(boolean mayInterruptIfRunning) API取消操作并释放执行线程。如果mayInterruptIfRunning的 值为true,则执行任务的线程将立即终止。
import lombok.extern.slf4j.Slf4j;
import java.util.concurrent.*;
/**
* @author lime
*/
@Slf4j
public class FutureTest {
public static void main(String[] args) throws Exception {
/**
* 创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
*/
ExecutorService executor = Executors.newCachedThreadPool();
Task task = new Task();
Future<Integer> future = executor.submit(task);
executor.shutdown();
try {
Thread.sleep(1000);
log.info("主线程在执行任务");
} catch (Exception e) {
log.error("", e);
}
//检查未来结果是否准备就绪,并在计算完成后获取数据
if (future.isDone() && !future.isCancelled()) {
log.info("运行结果:");
try {
//给定的操作指定超时。如果任务花费的时间超过此时间,则抛出TimeoutException
log.info(future.get(10, TimeUnit.SECONDS) + "");
} catch (Exception e) {
log.error("", e);
}
}
}
static class Task implements Callable<Integer> {
@Override
public Integer call() throws Exception {
log.info("子线程在执行任务");
return 1;
}
}
}