Callable和Future创建多线程

我们知道创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 
但是这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 
如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。

但是从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。

runnable

runnable是一个接口,里面只有run()方法,并且返回值是void类型,所以我们无法获取到任务执行完返回的结果。

Callable和Future创建多线程_第1张图片

 

callable也是一个接口,里面只有call()方法,不过返回值是泛型,则可以得到任务执行的结果。

Callable和Future创建多线程_第2张图片

 

Future

Future接口中声明了5个方法:

Callable和Future创建多线程_第3张图片

 

cancel:用来停止一个任务,如果任务可以停止返回true;如果任务已经完成或者已经停止或者这个任务无法停止返回false

isCancelled():判断任务是否被取消成功,如果在任务正常完成前被取消成功,返回true。

isDone():判断任务是否已完成,任务完成返回true。

get():用来获取执行结果,会一直等到任务执行完毕才返回,所以这个方法会产生阻塞。

get(long timeout,TimeUnit unit):在指定时间内或去执行结果,如果还没获取到则返回null。

总得来说就是:

判断任务是否完成;中断任务;获取任务执行结果。

Future类图结构:

Callable和Future创建多线程_第4张图片

FutureTask

Callable和Future创建多线程_第5张图片

ExecutorService 

ExecutorService 实例创建:

ExecutorService executorService1 = Executors.newSingleThreadExecutor();  
ExecutorService executorService2 = Executors.newFixedThreadPool(10);  
ExecutorService executorService3 = Executors.newScheduledThreadPool(10);  
ExecutorService executorService4 = Executors.newCachedThreadPool();

方法有:

Callable和Future创建多线程_第6张图片

首先Runnable的run()是没有返回值的,所以当es.submit()的参数只有一个Runnable对象的时候,通过ftask.get()得到的也是一个null值,当参数还有一个result的时候,就返回这个result;如果参数是一个Callable的对象的时候,Callable的call()是有返回值的,同时这个call()方法会在转换的Runable对象ftask的run()方法中被调用,然后将它的返回值赋值给一个全局变量,最后在ftask的get()方法中得到这个值

下面来看看实例:

Callable和Future创建多线程_第7张图片
Callable和Future创建多线程_第8张图片

你可能感兴趣的:(多线程)