Java 的Callable、Future和FutureTask
2017-03-24 20:00
127 查看
在java中,一般使用Thread抽象类或者Runnable接口来创建线程,但是这两种方法都不能获取线程执行完毕之后的结果。
为了获取到线程执行结果,必须使用Callable、Future或者FutureTask。
一般结合ExecutorService来使用Callable:在ExecutorService中有以下方法
则==可以使用 Future + Callable 的方法来获取执行结果==:
==还可以使用 Callable + FutureTask 获取执行结果==
以上参考:http://www.cnblogs.com/dolphin0520/p/3949310.html
为了获取到线程执行结果,必须使用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
相关文章推荐
- Java_并发线程_Future、FutureTask、Callable
- java并发编程:Callable、Future和FutureTask
- Java多线程21:多线程下的其他组件之CyclicBarrier、Callable、Future和FutureTask
- 线程池二:Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- JAVA---多线程之Callable与Future,FutureTask,及其简单应用
- 【Java多线程】-Callable,Future,FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java中的Runnable、Callable、Future、FutureTask的区别与示例
- [转载] Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask(原文链接:http://www.cnblogs.com/dolphin0520/p/3949310.html)
- Java并发编程:Callable、Future和FutureTask
- Java并发编程:Callable、Future和FutureTask
- 从头认识java-17.6 Callable、Future和FutureTask
- Java多线程之 Callable、Future和FutureTask
- Java中的Runnable、Callable、Future、FutureTask的区别与示例