FutureTask在我看来最主要的功能就是让线程有了返回值,Runnable和Thread都是无返回值的线程。
那么怎么会有返回值呢,这主要依靠它的几个状态以及参数outcome
private volatile int state; 线程状态
private static final int NEW = 0;未运行 起始态
private static final int COMPLETING = 1;运行完成但是outcome还未赋值,中间状态
private static final int NORMAL = 2;正常完成,outcome已赋值 最终态
private static final int EXCEPTIONAL = 3;异常完成,outcome存的是异常值 最终态
private static final int CANCELLED = 4;已取消 最终态
private static final int INTERRUPTING = 5;中断中,中间状态
private static final int INTERRUPTED = 6;中断,最终态
outcome主要就是用来存返回值
private Object outcome; // non-volatile, protected by state reads/writes
获取返回值用get方法,此方法在线程没有运行完时会阻塞等待。
具体使用:
1.
ExecutorService executorService = Executors.newCachedThreadPool();
Future submit = executorService.submit(() -> {
Thread.sleep(500);
return 1;
});
Object o = submit.get();
if (o instanceof Integer) {
int a = (Integer) o;
System.out.println(a);
}
2.
Future> submit1 = executorService.submit(new Thread(() -> System.out.println("11")));
System.out.println(submit1);
executorService.shutdown();
3.
FutureTask stringFutureTask = new FutureTask<>(new CallableTask());
Thread thread = new Thread(stringFutureTask);
thread.setName("task----xxxx");
thread.start();
if (!stringFutureTask.isDone()) {
Thread.sleep(3000);
}
System.out.println(stringFutureTask.get());
static class CallableTask implements Callable {
@Override
public String call() throws Exception {
Thread.sleep(5000);
System.out.println("got it");
return "xxxx";
}
}