文章为原创,转载请注明地址。
Runnable和Callable都是用来处理多线程业务,不过Runnable接口中run方法是抽象的void方法,无返回值;而Callable中的call方法是有返回值,用于处理需要接收返回值及监控线程运行状态接口的时候用到。我们接下来准深入Callbale这个接口
先看看Callable接口的源码;从代码中可以看到两点,1、可以将传入的泛型作为返回的类型;2、可以抛出异常。
当然不仅仅是这些,我们通过一段demo来解释,打印0到10的累加值,通过FutureTask接收,利用Executors进行执行。
结果:
代码中接收方式有两种,我们先跟下FutureTask的源码。
我们看到FutureTask是实现了RunnableFuture的泛型接口,继续跟代码。
看到这儿,大概有点感觉了。我们发现RunnableFuture这个接口继承了Runnable和Future这两个接口,反过去看,第二个接收方式就是Future,所以是可以的。OK,我们反过去看看FutureTask这个类。
先看看它的2个构造方法;第一个构造方法就是我们demo中用到的,非常好理解;主要是我们看看第二个构造方法.跟进调用的callable方法。
跟进来后一目了然,我们发现callable是一个重载方法。并且我们看到返回的时候是调用一个RunnableAdapter这个方法,adapter意思是适配器的意思;很显然,这里使用了适配器模式(这里可以跟进RunnableAdapter方法中继续看),利用RunnableAdapter这个方法将所传Runnable进行适配成FutureTask类型,这样的话,就可以异步进行线程状态监控及结果数据接收。什么意思呢?我们看下面的demo,我们模拟一个应用场景,比如我有一个线程,正在执行1-8的打印,现在我有另外一个线程数字9想异步插入到之间。OK,我们来实现它。
这是异步的方法
打印结果
从这点我们可以看出,通过FutureTask可以将CallableTest2这个类所实现的线程方法通过另启一个Thread进行调用,这也是callable衍生到FutureTask非常有用的地方。
总结:callable接口针对于有返回值的业务处理,以及在进行异步业务处理的时候,非常有用。通过结合Excutors和FutureTask的使用,能够监控我们代码中的线程任务的执行情况及状态;另外我们也可以通过这个接口来进行接口上的多线程应用的返回值处理。
下一篇,我们将再进行callable接口的继续深入,从线程的运行状态出发来充分的了解FutureTask的使用。