Java基础:通过Callable创建多线程
前面聊了创建线程的两种方式,一个是通过创建Thread类,还有一种是通过接口Runnable创建线程。
其实上面两种创建线程都有一个共同的问题,那就是没有返回值也就是无法得到线程的返回结果,所以为了支持这个操作也就有了Callable接口。当然也不是说没有返回值,就无法完成所有的操作,毕竟可以设置一个类属性绑定某个值即可,但是这样毕竟不方便。
Callable
现在看一下官网解释:
看官网文档可以总结一下几点:
- Callable可以实现线程返回结果,以及其实现的结果需要通过call方法,而不是run方法。而实现Callable需要重写Call方法。
- Call方法可以引发异常,而run方法不能。
但是现象有一个问题了,那就是如何让Callable和线程关联起来,毕竟Runnable可以和Thrend关联起来的:
而Callable无法与Thread进行关联起来,但是通过官网一直提示是对Runable的返回值优化,是否可以通过Runable然后将Callable与Thread关联起来呢?
然后打开Runnable然后看到如下:
现在只能依次从实现子类中依次查找了,最后发现了FutureTask:
可以发现一个规律:
Callable可以通过FutureTask构造方法得到一个FutureTask,而FutureTask是Runnable的子类。
下面就可以进行简单的演示了:
public class test implements Callable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask futureTask = new FutureTask(new test());
new Thread(futureTask).start();
// 通过futuretask得到这个返回值
System.out.println(futureTask.get());
}
@Override
public Object call() throws Exception {
System.out.println("测试线程");
return 12;
}
}
其实上面一个线程可以同callable实现,不过应该注意到做FutureTask这个类,现在聊一下这个类的特别之处。
其中说一点上面用到的FutureTask,其实这个有点像是JavaScript中回调函数了,在JavaScript中回调函数其实也是一种异步运行实现方式。这个本篇就是简单了解,后面单独一篇在捋一下这个类。这里只是简单说一下体验一下即可。毕竟本篇主要要是聊Callable实现线程的方法。后面单独一篇会聊这个类。