当前位置: 首页 > news >正文

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实现线程的方法。后面单独一篇会聊这个类。

相关文章:

  • 音视频封装格式:MPTG2-TS
  • Tlsr8258开发-修改蓝牙hid mouse
  • Miller Rabin学习笔记
  • 3D角色PBR入门简述
  • java毕业设计开题报告javaweb敬老院管理系统的设计和实现|养老院
  • 为什么电脑一用wps就卡住了?
  • Dubbo - 远程debug
  • Vue3+Vite+TS:多入口项目搭建(简单版)
  • 通用操作系统服务(一)、argparse模块
  • 安装MinGW win安装gcc
  • 从任正非的内部信,看系统开发公司如何度过寒冬
  • 面向智慧文博的知识图谱构建综述
  • 技术分享 | Bug定位方法
  • Web3的流支付代表Zebec,熊市布局的价值逻辑
  • ZFS文件系统预研资料
  • express.js的介绍及使用
  • fetch 从初识到应用
  • flutter的key在widget list的作用以及必要性
  • Github访问慢解决办法
  • IP路由与转发
  • JAVA之继承和多态
  • KMP算法及优化
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • log4j2输出到kafka
  • Mysql优化
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • React16时代,该用什么姿势写 React ?
  • React组件设计模式(一)
  • 安装python包到指定虚拟环境
  • 如何优雅地使用 Sublime Text
  • 实战|智能家居行业移动应用性能分析
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 自定义函数
  • ​虚拟化系列介绍(十)
  • (1)SpringCloud 整合Python
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (HAL库版)freeRTOS移植STMF103
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Matlab)使用竞争神经网络实现数据聚类
  • (多级缓存)缓存同步
  • (二)丶RabbitMQ的六大核心
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计大学生兼职系统
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (循环依赖问题)学习spring的第九天
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • /bin/bash^M: bad interpreter: No such file or directory
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @在php中起什么作用?
  • [ C++ ] STL---stack与queue