Callable接口

news2024/11/18 1:33:39

前言

获取多线程的方法,我们都知道有三种,还有一种是实现Callable接口

  • 实现Runnable接口
  • 实现Callable接口
  • 实例化Thread类
  • 使用线程池获取

Callable接口

Callable接口,是一种让线程执行完成后,能够返回结果的

在说到Callable接口的时候,我们不得不提到Runnable接口

/**
 * 实现Runnable接口
 */
class MyThread implements Runnable {

    @Override
    public void run() {

    }
}

我们知道,实现Runnable接口的时候,需要重写run方法,也就是线程在启动的时候,会自动调用的方法

同理,我们实现Callable接口,也需要实现call方法,但是这个时候我们还需要有返回值,这个Callable接口的应用场景一般就在于批处理业务,比如转账的时候,需要给一会返回结果的状态码回来,代表本次操作成功还是失败

/**
 * Callable有返回值
 * 批量处理的时候,需要带返回值的接口(例如支付失败的时候,需要返回错误状态)
 *
 */
class MyThread2 implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("come in Callable");
        return 1024;
    }
}

最后我们需要做的就是通过Thread线程, 将MyThread2实现Callable接口的类包装起来

这里需要用到的是FutureTask类,他实现了Runnable接口,并且还需要传递一个实现Callable接口的类作为构造函数

// FutureTask:实现了Runnable接口,构造函数又需要传入 Callable接口
// 这里通过了FutureTask接触了Callable接口
FutureTask<Integer> futureTask = new FutureTask<>(new MyThread2());
Thread t1 = new Thread(futureTask, "aaa");
t1.start();

最后通过 futureTask.get() 获取到返回值

// 输出FutureTask的返回值
System.out.println("result FutureTask " + futureTask.get());

这就相当于原来我们的方式是main方法一条龙之心,后面在引入Callable后,对于执行比较久的线程,可以单独新开一个线程进行执行,最后在进行汇总输出

最后需要注意的是 要求获得Callable线程的计算结果,如果没有计算完成就要去强求,会导致阻塞,直到计算完成

 

也就是说 futureTask.get() 需要放在最后执行,这样不会导致主线程阻塞

也可以使用下面算法,使用类似于自旋锁的方式来进行判断是否运行完毕

// 判断futureTask是否计算完成
while(!futureTask.isDone()) {

}

注意

多个线程执行 一个FutureTask的时候,只会计算一次

FutureTask<Integer> futureTask = new FutureTask<>(new MyThread2());

// 开启两个线程计算futureTask
new Thread(futureTask, "AAA").start();
new Thread(futureTask, "BBB").start();

如果我们要两个线程同时计算任务的话,那么需要这样写,需要定义两个futureTask

FutureTask<Integer> futureTask = new FutureTask<>(new MyThread2());
FutureTask<Integer> futureTask2 = new FutureTask<>(new MyThread2());

// 开启两个线程计算futureTask
new Thread(futureTask, "AAA").start();

new Thread(futureTask2, "BBB").start();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/129942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity天空盒】卡通渲染中如何实现云的消散效果

写在前面 完成大气渲染之后&#xff0c;接下来就是考虑云渲染了。因为我想做的天空盒本身是想跟着这位大佬Unity 卡通渲染 程序化天空盒 - 知乎里叙述的进程来的&#xff0c;里面云实现的是原神里的云&#xff0c;原神又是在崩3的基础上加上了消散效果。但现在能找到的一些教程…

线程中的sleep, yield, join

1. 前言 今天以具体实例的方法来详细记录下实战中的sleep, yield, join。 到底是什么意思&#xff0c;应该怎么用呢&#xff1f;&#xff1f;&#xff1f; 2. 适合人群 对该类方法的概念比较模糊的人 3. 开始 3.1 sleep 此方法是一个静态方法&#xff0c;可以通过类名直接调…

【MyBatis】安装 + 框架搭建 + 使用 + 优化(全程一条龙服务讲解~)

目录 前言 一、准备工作 1.1、下载MyBatis 1.2、数据库设计 二、搭建框架 2.1、创建Maven项目 2.2、jar包、引入依赖 2.3、创建MyBatis核心配置文件 2.4、映射文件 2.5、通过junit测试功能 2.6、框架优化 三、小结——注意事项 前言 本篇全程从0到1搭建MyBatis框架…

Python编程 简单春节倒计时教程(附源代码)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.应用的技术 1.Tkinter 2.PHotoimage 函数 3.label组件 二.效果图 三…

pytorch 咖啡豆识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章地址&#xff1a; 365天深度学习训练营-第P6周&#xff1a;好莱坞明星识别&#x1f356; 作者&#xff1a;K同学啊一、前期准备 1.设置GPU import torch from torch import nn …

2022 年 pnpm 为什么这么火?

pnpm是 Node.js 的替代包管理器。它是 npm 的直接替代品&#xff0c;但速度更快、效率更高。 为什么更有效率&#xff1f;当你安装一个包时&#xff0c;我们将它保存在你电脑上的全局存储中&#xff0c;然后我们从它创建一个硬链接而不是复制。也就是说&#xff1a;对于模块的…

8.移动端学习-rem适配方案

1.适配方案 1、当设备尺寸发生变化时&#xff0c;页面宽高等比例变化 2、使用媒体查询根据不同设备按比例设置html字体大小&#xff0c;页面元素使用rem做单位&#xff0c;当html字体大小变化&#xff0c;元素尺寸也会发生变化&#xff0c;从而达到等比缩放的适配 2.rem实际开…

ubuntu18.04运行ORB_SLAM2

1、基础工具安装 安装cmake、git、gcc、g。 sudo apt-get install cmake git gcc g 2、安装Eigen库 在终端输入以下代码。 sudo apt-get install libeigen3-dev 3、安装Pangolin0.5 版本过高会导致错误&#xff0c;安装依赖项。 sudo apt-get install libglew-dev libpyth…

Hadoop之Hdfs

一、基本概述 1、定义 HDFS&#xff08;Hadoop Distributed File System&#xff09;&#xff0c;它是一个文件系统&#xff0c;用于存储文件&#xff0c;通过目 录树来定位文件&#xff1b;其次&#xff0c;它是分布式的。HDFS 的使用场景&#xff1a;适合一次写入&#xff0…

这是长新冠,还是我老了?浙江出国抢订单又抢CTO;脉脉发布人才迁徙报告;元宇宙产业生态图谱;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 这是长新冠&#xff0c;还是我老了&#xff1f; 感染后身体出现了疲劳、关节疼痛、咳嗽等新症状&#xff1f;你并不孤单&#xff01;约翰霍普金斯…

数据结构进阶 二叉树OJ题一

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍几道二叉树的oj题 二叉树OJ题题目一 根据二叉树创建字符串题目二 二叉树的层序遍历题目三 二叉树的最近公共祖先题目一 根据…

自动化信息治理:推动价值、安全性和合规性

现代组织充斥着数据&#xff0c;但信息的洪流可能变得势不可挡&#xff0c;危及利用其价值的能力。内容服务解决方案能够减轻洪水泛滥的风险&#xff0c;并帮助组织更好地控制信息。 从信息中获取价值的不同之处在于治理。建立正确的治理框架&#xff0c;组织可以最大限度地利…

难以挖掘的真相——塑料版薯条、意大利面、披萨……

下方图片中的“美食”&#xff0c;看起来是不是十分美味&#xff1f; ▲莱佛士平面设计学生作品 可千万要擦亮眼睛&#xff0c;它们其实是&#xff1a;黄色瓶盖“蛋黄”的荷包蛋&#xff0c;黄色吸管的“薯条”&#xff0c;桔黄色的塑料带子“意大利面”&#xff0c;红色塑料袋…

Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法

系列文章目录 Exynos4412的Linux时钟驱动开发&#xff08;一&#xff09;——Exynos4412的时钟管理单元CMU Exynos4412的Linux时钟驱动开发&#xff08;二&#xff09;——clock的初始化&#xff08;CLK_OF_DECLARE的机制&#xff09; Exynos4412的Linux时钟驱动开发&#x…

新蜂商城 -- 代码学习研读

新蜂商城 -- 代码学习研读1.Big Data -- Postgres1.1 Big Data -- Postgres2.Big Data -- Postgres3.AwakeningGit Website: https://github.com/newbee-ltd/newbee-mall. 新蜂商城线上预览地址: http://mall.newbee.ltd. &#x1f449;&#x1f449;学习的朋友给个小星星.感…

蓝牙标签操作流程

电脑网页端后台系统 下载蓝牙标签APP注册账号&#xff0c;登录电脑网页端即可制作模板 蓝牙标签管理系统 安卓手机系统 1. 使用手机浏览器扫码下载 2. 拷贝链接到手机浏览器下载 http://a.picksmart.cn:8088/picksmart/app/new-app-release-v3.0.31.apk 苹果手机系统&#…

公众号运营要做什么?公众号运营规划方案分享

你真的理解什么是公众号运营吗&#xff1f; 公众号运营遵循的是创作-分发-增长-变现的路径&#xff0c;从内容创作到内容分发到用户增长&#xff0c;到最终的转化变现&#xff0c;这才是完整的一个运营闭环&#xff0c;在这条路径中&#xff0c;缺少了哪一环都将影响整体运营效…

学习笔记之范海鹰微表情识别

微表情识别1. 微表情由来1.1 基本情绪和次级情绪1.2 保罗埃克罗的贡献2. 微表情意义2.1 微表情产生原理2.2 微表情的形态意义2.3 微表情的读心内涵2.4 微表情的应用价值3.微表情面部表情3.1 基线反应3.2 惊讶3.3 厌恶、轻蔑3.4 愤怒3.5 恐惧3.6 悲伤3.7 愉悦作为网上冲浪12级选…

redis实现session管理以及缓存穿透与雪崩

小伙正在评博客之星&#xff0c;欢迎大家来互相助力 我的链接 redis实现session管理以及缓存穿透与雪崩一、Redis实现分布式Session管理1 管理机制2 开发Session管理1. 引入依赖2. 开发Session管理配置类3.打包测试即可二、缓存穿透与雪崩缓存穿透缓存击穿&#xff08;量太大&a…

APSIM练习 2:残留物覆盖对休耕期间土壤储水的影响

跟踪覆盖度随着残留物分解而下降。 APSIM 模拟了作物残茬对休耕期间水分捕获和保留效率的影响。随着残留物分解&#xff0c;残留物覆盖率下降。在 APSIM 中模拟残留物分解以响应天气以及残留物的化学成分。通过进行此模拟&#xff0c;您将加强在先前练习中学到的技能&#xff0…