Java并发编程:Callable、Future

在Java中创建创建线程有两种方式,一种是直接继承自Thread类,另一种是实现Runnbale接口。而这两种方式都有一个缺陷:在线程执行完以后无法直接获取执行结果。如果想要获取执行结果可以通过共享变量或者使用线程通信的方式来达到效果,但是这样比较麻烦。

而Callable和Future的作用,就是获得线程执行完以后的结果。


1.Callable

Callable是一个接口,类似于Runable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是Runnable不会返回结果,并且不会抛出经过检查的异常。

Callable接口只申明了一个方法call(),Callable是一个泛型接口,call()方法返回的类型就是传进来的泛型的类型。

Callable一般情况下可以配合ExecutorService使用,ExecutorService中有方法可以提交一个Callable任务并执行,最后返回一个Future结果:

<T> Future<T> submit(Callable<T> task)  提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。 
Future<?> submit(Runnable task)  提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 
<T> Future<T> submit(Runnable task, T result)  提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。


2.Future
Future也是一个接口,它就是Callable或者Runnable任务执行的结果,可以对执行的任务进行取消、查询是否完成等等。get()方法可以获取知行结果,该方法会阻塞直到任务返回结果。


3.使用示例

public class FutureTest {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newCachedThreadPool(); //构造线程池
        Task task = new Task();
        Future<Integer> result = executor.submit(task); //获取任务执行结果
        executor.shutdown();
         
        try {
            System.out.println("task运行结果"+result.get());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Task implements Callable<Integer>{

    @Override
    public Integer call() throws Exception { //返回类型为Integer
        Thread.sleep(3000);
        int sum = 0;
        for(int i=0;i<100;i++)
            sum += i;
        return sum;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值