您的位置:首页 > 编程语言 > Java开发

Java 的Callable、Future和FutureTask

2017-03-24 20:00 127 查看
在java中,一般使用Thread抽象类或者Runnable接口来创建线程,但是这两种方法都不能获取线程执行完毕之后的结果。

为了获取到线程执行结果,必须使用Callable、Future或者FutureTask。

1.Callable与Runnable

Runnable接口
public interface Runnable{
public abstract void run();
}

Callable接口
public interface Callable<V>{
V call() throws Exception;
}


一般结合ExecutorService来使用Callable:在ExecutorService中有以下方法

<T> Future<T> submit(Callable<T> task)
<T> Future<T> submit(Runnable task,T result)
Future<?> submit(Runnable task)


2.Future

Callable任务执行完毕只有,其结果保存在Future中。调用Future的get方法可以获取到具体的执行结果

public interface Future<T>{
boolean cancel(boolean mayInterruptIfRunning);
boolean isCancelled();
boolean isDone();
V get() throws Exception;//如果没有结果的话,会阻塞直到有结果
V get(long timeout,TimeUnit unit) throw Exception;//如果指定时间之后还没有结果的话,就返回null
}


3.FutureTask

public class FutureTask<V> implements RunnableFuture<V>

其中有:

public interface RunnableFuture<V> extends Runnable,Future<V>{
void run();
}

因此,FutureTask既是一个Runnable,又是一个Future

FutureTask构造方法有:

public FutureTask(Callable<V> callable){...}
public FutureTask(Runnable runnable,V result){...}


4.实例

假设当前有Task类实现了Callable接口:
class Task implements Callable<Integer>{

public Integer call()throws Exception{
int sum=0;
for(int i=0;i<10;i++){
sum=sum+i;
}
return sum;
}

}


则==可以使用 Future + Callable 的方法来获取执行结果==:

//将callable提交给线程池,线程池会返回一个Future
ExecutorService service=Executors.newFixedThreadPool();
Task task=new Task();
Future future=service.submit(task);
service.shutdown();
System.out.println("结果为"+future.get());


==还可以使用 Callable + FutureTask 获取执行结果==

//FutureTask既是被执行的任务,又包含了任务执行的结果
ExecutorService service=Executors.newFixedThreadPool();
Task task=new Task();
FutureTask<Integer> futureTask=new FutureTask<Integer>(task);
service.submit(futureTask);
//不一定非要通过线程池来运行任务,也可以通过new Thread(futureTask).start来运行该任务
service.shutdown();
System.out.println("执行结果为"+futureTask.get());

或者不通过线程池,而是直接生成一个线程来运行任务:
new Thread(futureTask).start()


以上参考:http://www.cnblogs.com/dolphin0520/p/3949310.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: