【LSP】简单理解Callable接口
简单理解Callable接口Callable接口:
Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解
优点:
可以获取线程的执行结果,也称为返回值
通过与Future的结合,可以实现利用Future来跟踪异步计算的结果
Runnable和Callable的区别:
Callable规定的方法是call(),Runnable规定的接口是run();
Callable的任务执行后可返回值,而Runnable的任务是不能有返回值的;
call方法可以抛出异常,run方法不可以
运行Callable任务可以拿到一个Future对象,表示异步计算的结果,它提供了检查是否计算完成的方法,以等待计算的完成,并检索计算的结果,通过Future对象可以了解任务执行情况,可以取消任务的执行,还可以获取执行结果
Future接口:
Future是一个接口,代表了一个异步计算的结果,接口中的方法用来检查计算是否完成,等待完成和得到计算结果;
当计算完成后,只能通过get()方法得到结果,get()方法会阻塞,一直到线程的计算结果完成并返回;
如果想取消,那么调用cancel()方法,其他方法用于确定任务是正常完成还是取消了;
一旦计算完成了,那么这个计算就不能被取消
FutureTask类:
FutureTask类实现了RunnableFuture接口,而RunnableFuture接口是继承了Runnable和Future接口,所以说FutureTask是一个提供异步计算结果的任务;
FutureTask可以用来包装Callable或者Runnable接口的实现对象,因为FutureTask实现了Runnable接口,所以FutureTask也可以提交给线程池
Callable,Future,FutureTask三者之间的关系:
图二
Callable的两种执行方式:
1:借助FutureTask,包装Callable接口的实现类,然后传递给Thread线程执行
复制代码
package org.dance.day2.future;
import org.dance.tools.SleepTools;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* Callable的两种执行方式
* @author ZYGisComputer
*/
public class UseCallable {
/**
* 实现Callable接口的线程
*/
private static class UseCall implements Callable{
private int sum;
@Override
public Integer call() throws Exception {
System.out.println("callable子线程开始执行任务计算");
Thread.sleep(2000);
for (int i = 0; ifutureTask = new FutureTask>(useCall);
// 包装为Thread
Thread thread = new Thread(futureTask);
http://cdn.u1.huluxia.com/g4/M02/75/5A/rBAAdl95xkqAAUxVAACt4WdlvYs039.jpghttp://cdn.u1.huluxia.com/g4/M02/75/5A/rBAAdl95xkuAO3KXAABxZXp_vKU750.jpg
页:
[1]