Runnable、Callable、Future 和 FutureTask
来源:互联网 发布:淘宝商家放单群2017 编辑:程序博客网 时间:2024/04/28 23:12
Runnable
其中Runnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值。然后使用某个线程去执行该runnable即可实现多线程,Thread类在调用start()函数后就是执行的是Runnable的run()函数。
Callable
Callable与Runnable的功能大致相似,Callable中有一个call()函数,但是call()函数有返回值,而Runnable的run()函数不能将结果返回给客户程序。
Runnable & Callable
并发编程时,一般使用 runnable, 然后扔给线程池,这种情况下不需要线程的结果, 所以 run 的返回值是 void 类型。
如果是一个多线程协作程序,比如菲波拉切数列,1,1,2,3,5,8…使用多线程来计算。
但后者需要前者的结果,就需要用 callable 接口了。
Future
Executor就是Runnable和Callable的调度容器,Future就是对于具体的Runnable或者Callable任务的执行结果进行
取消、查询是否完成、获取结果、设置结果操作。get方法会阻塞,直到任务返回结果(Future简介)。
FutureTask
FutureTask则是一个RunnableFuture,而RunnableFuture实现了Runnbale又实现了Futrue这两个接口,
FutureTask既是Future、
Runnable,又是包装了Callable(
如果是Runnable最终也会被转换为Callable ), 它是这两者的合体。
example
package com.effective.java.concurrent.task; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.FutureTask; /** * test future */public class RunnableFutureTask { /** * ExecutorService */ static ExecutorService mExecutor = Executors.newSingleThreadExecutor(); /** * * @param args */ public static void main(String[] args) { runnableDemo(); futureDemo(); } /** * runnable, 无返回值 */ static void runnableDemo() { new Thread(new Runnable() { @Override public void run() { System.out.println("runnable demo : " + fibc(20)); } }).start(); } /** * 其中Runnable实现的是void run()方法,无返回值;Callable实现的是 V * call()方法,并且可以返回执行结果。其中Runnable可以提交给Thread来包装下 * ,直接启动一个线程来执行,而Callable则一般都是提交给ExecuteService来执行。 */ static void futureDemo() { try { /** * 提交runnable则没有返回值, future没有数据 */ Future<?> result = mExecutor.submit(new Runnable() { @Override public void run() { fibc(20); } }); System.out.println("future result from runnable : " + result.get()); /** * 提交Callable, 有返回值, future中能够获取返回值 */ Future<Integer> result2 = mExecutor.submit(new Callable<Integer>() { @Override public Integer call() throws Exception { return fibc(20); } }); System.out .println("future result from callable : " + result2.get()); /** * FutureTask则是一个RunnableFuture<V>,即实现了Runnbale又实现了Futrue<V>这两个接口, * 另外它还可以包装Runnable(实际上会转换为Callable)和Callable * <V>,所以一般来讲是一个符合体了,它可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行 * ,并且还可以通过v get()返回执行结果,在线程体没有执行完成的时候,主线程一直阻塞等待,执行完则直接返回结果。 */ FutureTask<Integer> futureTask = new FutureTask<Integer>( new Callable<Integer>() { @Override public Integer call() throws Exception { return fibc(20); } }); // 提交futureTask mExecutor.submit(futureTask) ; System.out.println("future result from futureTask : " + futureTask.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } /** * 效率底下的斐波那契数列, 耗时的操作 * * @param num * @return */ static int fibc(int num) { if (num == 0) { return 0; } if (num == 1) { return 1; } return fibc(num - 1) + fibc(num - 2); } } // resultrunnable demo : 6765future result from runnable : nullfuture result from callable : 6765future result from futureTask : 6765
reference
http://blog.csdn.net/bboyfeiyu/article/details/24851847
- Runnable、Callable、Future 和 FutureTask
- Runnable、Callable、Future、FutureTask
- Runnable、Callable、Future、FutureTask
- Runnable,Callable,Future和FutureTask简介
- Runnable、Callable、Future和FutureTask的说明
- Runnable、Callable、Executor、Future、FutureTask
- Runnable/Thread/Callable/Future/FutureTask
- Callable、Runnable、Future、RunnableFuture和FutureTask 深入理解
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable和Future、FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Callable、Future和FutureTask
- Runnable、Callable、Executor、Future、FutureTask关系解读
- 解析UML类图符号意义
- Sass的@each指令
- 编程. 已知字符串:"this is a test of java". 按要求执行以下操作: (1) 统计该字符串中字母s出现的次数 (2) 取出子字符串"test" (3) 用多种方式将本字
- notepad++运行c程序
- 算法导论 练习题 14.3-3
- Runnable、Callable、Future 和 FutureTask
- 类中的const使用
- 15、反转链表
- 蓝桥杯--算法提高:拿糖果(动态规划)
- Niushop开源商城特点
- 最简单方法将项目上传到github
- Hadoop 2.6.0 POM.xml
- websocket 心跳检测
- jsp页面登录验证