相信大多数人在使用多线程时,都会使用Thread类或者Runnable接口,但是相比于这两个方法,使用CallAble接口是更加的有效,因为CallAble是可以有返回值的存在,并且可以自己定义返回值的类型.那为什么它会有这样一个返回值呢?
其实我们看CallAble接口的源码,很简单,就是有一个Call方法,那么它是如何做到返回值的呢,这我们就要看一个它的包装类了FutureTask类,这个类继承了Runnable和Future这两个接口,定义了一个构造函数来初始化他的CallAble对象,所以我们CallAble的使用都是将其传入FutureTask类中,FutureTask类中有两个重要的方法,一个是call方法,还有一个是get方法,这两个方法就是能够获取到返回值的原因,那他是怎么做的呢,其实我在前面就说了他的内部定义了一个CallAble对象,通过CallAble对象的Call方法,我们可以获取到他的返回值,然后我们只需要将该返回值传入它的get方法中那不就可以了吗.
但是还有一个问题是需要解决的,那就是如何保证在call方法能比get方法先执行完成返回值成功呢,如果是get方法先执行了,那么就无法在get方法中获取到该返回值.
为了解决这个问题,一开始我想到的是在get方法中用while循环,判断他有值才返回该值,但是在我看了源码之后,我发现它的做法比我的高明了很多,它是在Call方法中加了一个锁,然后在get方法中判断该锁是否已经被释放,如果被释放那就说明已经可以获取到该返回值.
版权声明:本文为safadfasd原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。