5. Callable
Callable: 有返回值的线程
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "成功";
}
};
ExecutorService executorService = Executors.newCachedThreadPool();
Future<String> future = executorService.submit(callable);
String result = null;
try {
result = future.get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("result:" + result);
Callable 与 Runnable
都是以 able 结束,可以开启线程
Callable 有返回值
那么现在就有一个问题,子现场是耗时操作的,他的返回值返回给谁用呢,主线程如何不阻塞的情况下拿到子线程的返回值呢?
我们接下来解释这个问题
首先,executorService.submit(callable) 中,executor 调用的不是 execute(callable) 而是 submit(callable)
然后配合 future.get() 去取值,这里的取值,是阻塞式的,能保证我们值的可靠性,这是 Java 在 API 层能做到的上限了。
其中,future 提供一种方法让主线程能够主动去询问后台线程是否执行完毕,他就是:future.isDone()