JUC 第3章Callable接口
第3章 Callable接口
1. 是什么
1.1 面试题:获得多线程的方法几种?
错误回答:
(1)继承thread类(2)runnable接口如果只回答这两个你连被问到juc的机会都没有。
正确回答:
传统的是继承thread类和实现runnable接口,java5以后又有实现callable接口和java的线程池获得。
1.2 功能接口
这是一个功能接口,因此可以用作lambda表达式或方法引用的赋值对象。
2. 与runnable对比

面试题:callable接口与runnable接口的区别?
答:(1)是否有返回值
(2)是否抛异常
(3)落地方法不一样,一个是run,一个是call
3. 怎么用
3.1 直接替换runnable是否可行?
不可行,因为:thread类的构造方法根本没有Callable
3.2 认识陌生人找中间人
这像认识一个不认识的同学,我可以找中间人介绍。
中间人是什么?java多态,一个类可以实现多个接口!!
3.3 FutureTask
(1 )是什么
未来的任务,用它就干一件事,异步调用
main方法就像一个冰糖葫芦,一个个方法由main串起来。
但解决不了一个问题:正常调用挂起堵塞问题
例子:
1、老师上着课,口渴了,去买水不合适,讲课线程继续,我可以单起个线程找班长帮忙买水,
水买回来了放桌上,我需要的时候再去get。
2、4个同学,A算1+20,B算21+30,C算31*到40,D算41+50,是不是C的计算量有点大啊,
FutureTask单起个线程给C计算,我先汇总ABD,最后等C计算完了再汇总C,拿到最终结果
3、高考:会做的先做,不会的放在后面做
(2) 原理
在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,
当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。
一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,
就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。
只计算一次
get方法放到最后
(3) 程序代码