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

原创粉丝点击