如何详细解析Future与FutureTask接口实现示例?

2026-05-25 22:431阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1762个文字,预计阅读时间需要8分钟。

如何详细解析Future与FutureTask接口实现示例?

目录正文Future类FutureTask类Callable接口获取执行结果Callable + FutureTask获取执行结果Future概述Future是对具体Runnable或Callable任务执行结果的抽象表示,允许异步执行任务并获取其结果。它提供了获取执行结果、查询是否完成以及取消任务等操作。

Future类Future接口定义了以下方法:- V get():阻塞当前线程,直到任务完成并返回结果。- V get(long timeout, TimeUnit unit):在指定时间内阻塞当前线程,如果超时则返回null。- boolean isDone():判断任务是否已完成。- boolean cancel(boolean mayInterruptIfRunning):取消任务,如果任务尚未开始,则不会执行;如果任务已经开始,则根据参数决定是否中断正在执行的任务。

FutureTask类FutureTask类实现了Future接口,并提供了对Runnable和Callable任务的支持。它有两种构造函数:- FutureTask(Runnable task):用于Runnable任务。- FutureTask(Callable task):用于Callable任务。

Callable接口Callable接口与Runnable接口类似,但Callable可以抛出异常,并且返回值。Callable接口定义了以下方法:- V call():执行任务并返回结果。

获取执行结果使用Future获取执行结果:javaFuture future=executor.submit(new Callable() { @Override public String call() throws Exception { // 执行任务 return 结果; }});

try { String result=future.get(); System.out.println(result);} catch (InterruptedException | ExecutionException e) { e.printStackTrace();}

Callable + FutureTask获取执行结果:javaCallable callable=new Callable() { @Override public String call() throws Exception { // 执行任务 return 结果; }};

FutureTask futureTask=new FutureTask(callable);Executor executor=Executors.newSingleThreadExecutor();executor.submit(futureTask);

try { String result=futureTask.get(); System.out.println(result);} catch (InterruptedException | ExecutionException e) { e.printStackTrace();}

目录
  • 正文
  • Future类
  • FutureTask
    • Callable+Future获取执行结果
    • Callable+FutureTask获取执行结果

正文

Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果等操作。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。

Future类

Future类位于java.util.concurrent包下,它是一个接口:

/** * @see FutureTask * @see Executor * @since 1.5 * @author Doug Lea * @param <V> The result type returned by this Future's <tt>get</tt> method */ public interface Future<V> { /** * Attempts to cancel execution of this task. This attempt will * fail if the task has already completed, has already been cancelled, * or could not be cancelled for some other reason. If successful, * and this task has not started when <tt>cancel</tt> is called, * this task should never run. If the task has already started, * then the <tt>mayInterruptIfRunning</tt> parameter determines * whether the thread executing this task should be interrupted in * an attempt to stop the task. * */ boolean cancel(boolean mayInterruptIfRunning); /** * Returns <tt>true</tt> if this task was cancelled before it completed * normally. */ boolean isCancelled(); /** * Returns <tt>true</tt> if this task completed. * */ boolean isDone(); /** * Waits if necessary for the computation to complete, and then * retrieves its result. * * @return the computed result */ V get() throws InterruptedException, ExecutionException; /** * Waits if necessary for at most the given time for the computation * to complete, and then retrieves its result, if available. * * @param timeout the maximum time to wait * @param unit the time unit of the timeout argument * @return the computed result */ V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }

在Future接口中声明了5个方法,下面依次解释每个方法的作用:

cancel()方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。

isCancelled()方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。

isDone()方法表示任务是否已经完成,若任务完成,则返回true;

get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

也就是说Future提供了三种功能:

  • 1)判断任务是否完成;
  • 2)能够中断任务;
  • 3)能够获取任务执行结果。

因为Future只是一个接口,所以是无法直接用来创建对象使用的,因此就有了下面的FutureTask。

FutureTask

FutureTask的实现:

public class FutureTask<V> implements RunnableFuture<V>

FutureTask类实现了RunnableFuture接口,RunnableFuture接口:

public interface RunnableFuture<V> extends Runnable, Future<V> { /** * Sets this Future to the result of its computation * unless it has been cancelled. */ void run(); }

可以看出RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
FutureTask提供了2个构造器:

public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; // ensure visibility of callable } public FutureTask(Runnable runnable, V result) { this.callable = Executors.callable(runnable, result); this.state = NEW; // ensure visibility of callable }

可以看到,Runnable注入会被Executors.callable()函数转换为Callable类型,即FutureTask最终都是执行Callable类型的任务。该适配函数的实现如下:

public static <T> Callable<T> callable(Runnable task, T result) { if (task == null) throw new NullPointerException(); return new RunnableAdapter<T>(task, result); }

RunnableAdapter适配器

/** * A callable that runs given task and returns given result */ static final class RunnableAdapter<T> implements Callable<T> { final Runnable task; final T result; RunnableAdapter(Runnable task, T result) { this.task = task; this.result = result; } public T call() { task.run(); return result; } }

FutureTask是Future接口的一个唯一实现类。

FutureTask实现了Runnable,因此它既可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行。

FutureTask实现了Futrue可以直接通过get()函数获取执行结果,该函数会阻塞,直到结果返回。

实例:

Callable+Future获取执行结果

public class Test { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); Task task = new Task(); Future<Integer> result = executor.submit(task); executor.shutdown(); try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("主线程在执行任务"); try { System.out.println("task运行结果"+result.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("所有任务执行完毕"); } } class Task implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("子线程在进行计算"); Thread.sleep(3000); int sum = 0; for(int i=0;i<100;i++) sum += i; return sum; } }

执行结果:

如何详细解析Future与FutureTask接口实现示例?

子线程在进行计算
主线程在执行任务
task运行结果4950
所有任务执行完毕

Callable+FutureTask获取执行结果

public class Test { public static void main(String[] args) { //第一种方式 ExecutorService executor = Executors.newCachedThreadPool(); Task task = new Task(); FutureTask<Integer> futureTask = new FutureTask<Integer>(task); executor.submit(futureTask); executor.shutdown(); //第二种方式,注意这种方式和第一种方式效果是类似的,只不过一个使用的是ExecutorService,一个使用的是Thread /*Task task = new Task(); FutureTask<Integer> futureTask = new FutureTask<Integer>(task); Thread thread = new Thread(futureTask); thread.start();*/ try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("主线程在执行任务"); try { System.out.println("task运行结果"+futureTask.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("所有任务执行完毕"); } } class Task implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("子线程在进行计算"); Thread.sleep(3000); int sum = 0; for(int i=0;i<100;i++) sum += i; return sum; } }

以上就是Future与FutureTask接口实现示例详解的详细内容,更多关于Future FutureTask接口实现的资料请关注自由互联其它相关文章!

本文共计1762个文字,预计阅读时间需要8分钟。

如何详细解析Future与FutureTask接口实现示例?

目录正文Future类FutureTask类Callable接口获取执行结果Callable + FutureTask获取执行结果Future概述Future是对具体Runnable或Callable任务执行结果的抽象表示,允许异步执行任务并获取其结果。它提供了获取执行结果、查询是否完成以及取消任务等操作。

Future类Future接口定义了以下方法:- V get():阻塞当前线程,直到任务完成并返回结果。- V get(long timeout, TimeUnit unit):在指定时间内阻塞当前线程,如果超时则返回null。- boolean isDone():判断任务是否已完成。- boolean cancel(boolean mayInterruptIfRunning):取消任务,如果任务尚未开始,则不会执行;如果任务已经开始,则根据参数决定是否中断正在执行的任务。

FutureTask类FutureTask类实现了Future接口,并提供了对Runnable和Callable任务的支持。它有两种构造函数:- FutureTask(Runnable task):用于Runnable任务。- FutureTask(Callable task):用于Callable任务。

Callable接口Callable接口与Runnable接口类似,但Callable可以抛出异常,并且返回值。Callable接口定义了以下方法:- V call():执行任务并返回结果。

获取执行结果使用Future获取执行结果:javaFuture future=executor.submit(new Callable() { @Override public String call() throws Exception { // 执行任务 return 结果; }});

try { String result=future.get(); System.out.println(result);} catch (InterruptedException | ExecutionException e) { e.printStackTrace();}

Callable + FutureTask获取执行结果:javaCallable callable=new Callable() { @Override public String call() throws Exception { // 执行任务 return 结果; }};

FutureTask futureTask=new FutureTask(callable);Executor executor=Executors.newSingleThreadExecutor();executor.submit(futureTask);

try { String result=futureTask.get(); System.out.println(result);} catch (InterruptedException | ExecutionException e) { e.printStackTrace();}

目录
  • 正文
  • Future类
  • FutureTask
    • Callable+Future获取执行结果
    • Callable+FutureTask获取执行结果

正文

Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果等操作。必要时可以通过get方法获取执行结果,该方法会阻塞直到任务返回结果。

Future类

Future类位于java.util.concurrent包下,它是一个接口:

/** * @see FutureTask * @see Executor * @since 1.5 * @author Doug Lea * @param <V> The result type returned by this Future's <tt>get</tt> method */ public interface Future<V> { /** * Attempts to cancel execution of this task. This attempt will * fail if the task has already completed, has already been cancelled, * or could not be cancelled for some other reason. If successful, * and this task has not started when <tt>cancel</tt> is called, * this task should never run. If the task has already started, * then the <tt>mayInterruptIfRunning</tt> parameter determines * whether the thread executing this task should be interrupted in * an attempt to stop the task. * */ boolean cancel(boolean mayInterruptIfRunning); /** * Returns <tt>true</tt> if this task was cancelled before it completed * normally. */ boolean isCancelled(); /** * Returns <tt>true</tt> if this task completed. * */ boolean isDone(); /** * Waits if necessary for the computation to complete, and then * retrieves its result. * * @return the computed result */ V get() throws InterruptedException, ExecutionException; /** * Waits if necessary for at most the given time for the computation * to complete, and then retrieves its result, if available. * * @param timeout the maximum time to wait * @param unit the time unit of the timeout argument * @return the computed result */ V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }

在Future接口中声明了5个方法,下面依次解释每个方法的作用:

cancel()方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。

isCancelled()方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。

isDone()方法表示任务是否已经完成,若任务完成,则返回true;

get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

也就是说Future提供了三种功能:

  • 1)判断任务是否完成;
  • 2)能够中断任务;
  • 3)能够获取任务执行结果。

因为Future只是一个接口,所以是无法直接用来创建对象使用的,因此就有了下面的FutureTask。

FutureTask

FutureTask的实现:

public class FutureTask<V> implements RunnableFuture<V>

FutureTask类实现了RunnableFuture接口,RunnableFuture接口:

public interface RunnableFuture<V> extends Runnable, Future<V> { /** * Sets this Future to the result of its computation * unless it has been cancelled. */ void run(); }

可以看出RunnableFuture继承了Runnable接口和Future接口,而FutureTask实现了RunnableFuture接口。所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值。
FutureTask提供了2个构造器:

public FutureTask(Callable<V> callable) { if (callable == null) throw new NullPointerException(); this.callable = callable; this.state = NEW; // ensure visibility of callable } public FutureTask(Runnable runnable, V result) { this.callable = Executors.callable(runnable, result); this.state = NEW; // ensure visibility of callable }

可以看到,Runnable注入会被Executors.callable()函数转换为Callable类型,即FutureTask最终都是执行Callable类型的任务。该适配函数的实现如下:

public static <T> Callable<T> callable(Runnable task, T result) { if (task == null) throw new NullPointerException(); return new RunnableAdapter<T>(task, result); }

RunnableAdapter适配器

/** * A callable that runs given task and returns given result */ static final class RunnableAdapter<T> implements Callable<T> { final Runnable task; final T result; RunnableAdapter(Runnable task, T result) { this.task = task; this.result = result; } public T call() { task.run(); return result; } }

FutureTask是Future接口的一个唯一实现类。

FutureTask实现了Runnable,因此它既可以通过Thread包装来直接执行,也可以提交给ExecuteService来执行。

FutureTask实现了Futrue可以直接通过get()函数获取执行结果,该函数会阻塞,直到结果返回。

实例:

Callable+Future获取执行结果

public class Test { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); Task task = new Task(); Future<Integer> result = executor.submit(task); executor.shutdown(); try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("主线程在执行任务"); try { System.out.println("task运行结果"+result.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("所有任务执行完毕"); } } class Task implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("子线程在进行计算"); Thread.sleep(3000); int sum = 0; for(int i=0;i<100;i++) sum += i; return sum; } }

执行结果:

如何详细解析Future与FutureTask接口实现示例?

子线程在进行计算
主线程在执行任务
task运行结果4950
所有任务执行完毕

Callable+FutureTask获取执行结果

public class Test { public static void main(String[] args) { //第一种方式 ExecutorService executor = Executors.newCachedThreadPool(); Task task = new Task(); FutureTask<Integer> futureTask = new FutureTask<Integer>(task); executor.submit(futureTask); executor.shutdown(); //第二种方式,注意这种方式和第一种方式效果是类似的,只不过一个使用的是ExecutorService,一个使用的是Thread /*Task task = new Task(); FutureTask<Integer> futureTask = new FutureTask<Integer>(task); Thread thread = new Thread(futureTask); thread.start();*/ try { Thread.sleep(1000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println("主线程在执行任务"); try { System.out.println("task运行结果"+futureTask.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("所有任务执行完毕"); } } class Task implements Callable<Integer>{ @Override public Integer call() throws Exception { System.out.println("子线程在进行计算"); Thread.sleep(3000); int sum = 0; for(int i=0;i<100;i++) sum += i; return sum; } }

以上就是Future与FutureTask接口实现示例详解的详细内容,更多关于Future FutureTask接口实现的资料请关注自由互联其它相关文章!