Java —— Callable接口、Future接口、FutureTask接口

Callable接口与Runnable接口的区别

  1. Callable功能更强大些。
  2. 相比run()方法,可以有返回值。
  3. 方法可以抛出异常。
  4. 支持泛型的返回值。
  5. 需要借助FutureTask类,比如获取返回结果。

Callable接口

Callable接口类似于Runnable ,因为它们都是为其实例可能由另一个线程执行的类设计的。 然而,Runnable不返回结果,也不能抛出被检查的异常。

方法

类型和返回值方法和描述
Vcall()

计算一个结果,如果不能这样做,就会抛出一个异常。

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

Future接口

可以对具体Runnable、Callable任务的执行结果进行取消、查询是 否完成、获取结果等。FutrueTask是Futrue接口的唯一的实现类。 FutureTask 同时实现了Runnable, Future接口。它既可以作为 Runnable被线程执行,又可以作为Future得到Callable的返回值。

提供方法来检查计算是否完成,等待其完成,并检索计算结果。 结果只能在计算完成后使用方法get进行检索,如有必要,阻塞,直到准备就绪。 取消由cancel方法执行。 提供其他方法来确定任务是否正常完成或被取消。 计算完成后,不能取消计算。 如果您想使用Future ,以便不可撤销,但不提供可用的结果,则可以声明Future<?>表格的类型,并返回null作为基础任务的结果。

方法

类型和返回值方法和描述
booleancancel(boolean mayInterruptIfRunning)

尝试取消执行此任务。

Vget()

等待计算完成,然后检索其结果。

Vget(long timeout, TimeUnit unit)

如果需要等待最多在给定的时间计算完成,然后检索其结果(如果可用)。

booleanisCancelled()

如果此任务在正常完成之前被取消,则返回 true

booleanisDone()

返回 true如果任务已完成。

public interface Future<V> {
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
    V get() throws InterruptedException, ExecutionException;
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

FutureTask接口

该类提供了一个Future基本实现(FutrueTask是Futrue接口的唯一的实现类),具有启动和取消计算的方法,查询计算是否完整,并检索计算结果。 结果只能在计算完成后才能检索; 如果计算尚未完成,则get方法将阻止。 一旦计算完成,则无法重新启动或取消计算(除非使用runAndReset()调用计算 )。FutureTask可用于包装CallableRunnable对象。 因为FutureTask实现Runnable ,一个FutureTask可以提交到一个Executor执行。

除了作为独立类之外,此类还提供了protected功能,在创建自定义任务类时可能很有用。

构造方法

构造方法和描述
FutureTask(Callable<V> callable)

创建一个 FutureTask ,它将在运行时执行给定的 Callable

FutureTask(Runnable runnable, V result)

创建一个 FutureTask ,将在运行时执行给定的 Runnable ,并安排 get将在成功完成后返回给定的结果。

方法

修饰语和类型方法和描述
booleancancel(boolean mayInterruptIfRunning)

尝试取消执行此任务。

protected voiddone()

此任务转换到状态 isDone (无论是正常还是通过取消)调用的受保护方法。

Vget()

等待计算完成,然后检索其结果。

Vget(long timeout, TimeUnit unit)

如果需要等待最多在给定的时间计算完成,然后检索其结果(如果可用)。

booleanisCancelled()

如果此任务在正常完成之前取消,则返回 true

booleanisDone()

返回 true如果任务已完成。

voidrun()

将此未来设置为其计算结果,除非已被取消。

protected booleanrunAndReset()

执行计算而不设置其结果,然后将此将来重置为初始状态,如果计算遇到异常或被取消,则不执行此操作。

protected voidset(V v)

将此未来的结果设置为给定值,除非此未来已被设置或已被取消。

protected voidsetException(Throwable t)

导致这个未来报告一个ExecutionException与给定的可抛弃的原因,除非这个未来已经被设置或被取消。

例如

package com.test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

class SumTotal implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i < 50; i++) {
            if (i%20 == 0){
                System.out.println("sleep");
                Thread.sleep(100);
                System.out.println(Thread.currentThread().getName()+"  " + i);
            }
            sum += i;
        }

        return sum;
    }
}

public class Main7 {
    public static void main(String[] args) {
        //实例化对象
        SumTotal sumTotal = new SumTotal();
        //创建FutureTask
        FutureTask<Integer> futureTask = new FutureTask<Integer>(sumTotal);
        //执行线程任务
        Thread thread = new Thread(futureTask);
        thread.setName("线程1");
        thread.start();

        //获取线程任务返回值

        try {
            int sum = futureTask.get();
            System.out.println(sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值