Java基础:通过Callable创建多线程

前面聊了创建线程的两种方式,一个是通过创建Thread类,还有一种是通过接口Runnable创建线程。

其实上面两种创建线程都有一个共同的问题,那就是没有返回值也就是无法得到线程的返回结果,所以为了支持这个操作也就有了Callable接口。当然也不是说没有返回值,就无法完成所有的操作,毕竟可以设置一个类属性绑定某个值即可,但是这样毕竟不方便。

Callable

现在看一下官网解释:
在这里插入图片描述

看官网文档可以总结一下几点:

  • Callable可以实现线程返回结果,以及其实现的结果需要通过call方法,而不是run方法。而实现Callable需要重写Call方法。
  • Call方法可以引发异常,而run方法不能。

但是现象有一个问题了,那就是如何让Callable和线程关联起来,毕竟Runnable可以和Thrend关联起来的:

在这里插入图片描述

而Callable无法与Thread进行关联起来,但是通过官网一直提示是对Runable的返回值优化,是否可以通过Runable然后将Callable与Thread关联起来呢?

然后打开Runnable然后看到如下:

在这里插入图片描述

现在只能依次从实现子类中依次查找了,最后发现了FutureTask:

在这里插入图片描述

可以发现一个规律:

Callable可以通过FutureTask构造方法得到一个FutureTask,而FutureTaskRunnable的子类。

下面就可以进行简单的演示了:

public class test implements Callable {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(new test());
        new Thread(futureTask).start();
// 通过futuretask得到这个返回值
        System.out.println(futureTask.get());
    }

    @Override
    public Object call() throws Exception {
        System.out.println("测试线程");
        return 12;
    }
}

在这里插入图片描述

其实上面一个线程可以同callable实现,不过应该注意到做FutureTask这个类,现在聊一下这个类的特别之处。
其中说一点上面用到的FutureTask,其实这个有点像是JavaScript中回调函数了,在JavaScript中回调函数其实也是一种异步运行实现方式。这个本篇就是简单了解,后面单独一篇在捋一下这个类。这里只是简单说一下体验一下即可。毕竟本篇主要要是聊Callable实现线程的方法。后面单独一篇会聊这个类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值