java多线程(4):Callable接口及Future返回值接口

前言

之前我们创建线程是实现Runnable接口,并实现其中的run()方法,这个方法的返回值是void,如果我们想要返回结果怎么办?JDK5给我们提供了一个新的接口,就是Callable接口,其中的call()方法是有返回值的,这个返回值会被Future接口来承接。

正文

我们来看这个call()方法,方法的返回值类型是泛型,可以由用户指定。

@FunctionalInterface
public interface Callable<V> {
    /**
     * Computes a result, or throws an exception if unable to do so.
     *
     * @return computed result
     * @throws Exception if unable to compute a result
     */
    V call() throws Exception;
}

call()方法的返回结果可以由Future接口来承接,我们来看看Future接口的方法。我们看到2个重载的get()方法就是获取返回结果。
在这里插入图片描述
接下来看一个例子:

package org.jimmy.study;

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

public class Main {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 适配类
        FutureTask futureTask = new FutureTask(new Task());
        // 启动线程
        new Thread(futureTask).start();
        // 主线程
        System.out.println(Thread.currentThread().getName() + "执行了");
        // 获取返回结果
        String result = (String) futureTask.get();
        System.out.println(result);
    }
}

// 实现接口并指定返回值类型
class Task implements Callable<String> {

    public String call() throws Exception {
        System.out.println(Thread.currentThread().getName() + "执行了");
        return "hello";
    }
}

执行结果:

Thread-0执行了
main执行了
hello

总结

至此我们学会了3种创建线程的方式,分别是继承Thread类、实现Runnable接口、实现Callable接口。但是,实际中我们并不会使用这几种方式来创建线程,而是用Java提供的线程池,线程池的好处有很多,我们在下一章继续讲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值