使用Callable和FutureTask使用多线程

使用Callable接口封装任务可以获得任务执行后的结果。它的接口定义比较简单,里面有一个call()方法,和Runnable接口里面的run()方法基本一样,可以看到,Callable接口是在util.concurrent多线程包下的类,它的返回值是一个泛型。

package java.util.concurrent;
@FunctionalInterface
public interface Callable<V> {
    V call() throws Exception;
}

Future接口也是在多线程包下的一个接口,这个接口用于封装多线程异步执行的结果,它有下面几个方法。

package java.util.concurrent;
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;
}

方法boolean cancel(boolean mayInterruptIfRunning),这个方法根据传入的参数来决定对当前任务进行取消的操作,传入true,代表取消掉当前正在执行但是还未执行完毕的的子任务,传入false代表不取消当前执行的子任务,返回值代表当前是否被成功取消。

方法boolean isCancelled() 可以用来获取当前子任务的状态:是否被取消。

方法boolean isDone() 用来判断当前线程任务是否执行完毕。

方法V get() 用来获取当前执行的子线程任务返回的结果,如果线程还未执行完则进入阻塞等待结果,如果执行过程中出现异常或者被中断,则会抛出对应的异常。

V get(long timeout, TimeUnit unit) 可以设置时间限制的get(),一定的时间下如果还未获取到线程执行的结果则会抛出超时的异常。

看一看FutureTask的继承关系

FutureTask implements RunnableFuture
RunnableFuture extends Runnable, Future

可以看到 RunnableFuture是Runnable和Future组合,当创建一个FutureTask对象时,要传入一个实现了Callable 接口的子任务,FutureTask包装了子任务,然后丢给Thread或者线程池去执行当前封装的任务。

测试代码

/**
 * 测试多线程FutureTask下获取返回值得小Demo
 */
public class MutipleThread {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask futureTask = new FutureTask<String>(new Callable<String>() {

            @Override
            public String call() throws Exception {
                return "这个是返回值";
            }
        });

        futureTask.run();
        System.out.println((String) futureTask.get());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值