Runnable的缺陷
不能返回返回值
不能抛出Checked Exception
Callable接口
实现call()
有返回值
可以抛出异常
Future类
Future和Callable的关系
Future的5个方法
1. get() :获取结果
2. get(long time, TimeUnit unit):有超时的获取
3. cancel():取消任务
4. isDone(): 判断线程是否执行完毕
执行完毕不代表成功执行了,执行失败,或者被中断也是执行完毕了,不再执行了
5. isCanceled():判断是否被取消
get的基本用法
用法一:线程池的Submit方法返回Future对象
线程池的submit方法返回Future对象.png
placeHolder是一个空的容器
/**
* 描述: 演示一个Future的使用方法
*/
public class OneFuture {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(10);
Future<Integer> future = service.submit(new CallableTask());
try {
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
service.shutdown();
}
static class CallableTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
Thread.sleep(3000);
return new Random().nextInt();
}
}
}
用法二:用FutureTask创建Future
Future, FutureTask, Runnable的关系
/**
* 描述: 演示FutureTask的用法
*/
public class FutureTaskDemo {
public static void main(String[] args) {
Task task = new Task();
FutureTask<Integer> integerFutureTask = new FutureTask<>(task);
// new Thread(integerFutureTask).start();
ExecutorService service = Executors.newCachedThreadPool();
service.submit(integerFutureTask);
try {
System.out.println("task运行结果:"+integerFutureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class Task implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("子线程正在计算");
Thread.sleep(3000);
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
return sum;
}
}