系列八、Callable接口

news2024/9/22 21:15:12

一、Callable vs Runnable

(1)Callable接口有返回值,Runnable接口无返回值;

(2)Callable接口会抛异常,Runnable接口不会抛异常;

(3)落地方法不一样,Callable是call,Runnable是run;

二、怎么用

2.1、直接替换Runnable是否可行

不可行。因为Thread类的构造方法根本没有Callable。

2.2、适用场景

这像认识一个不认识的同学,我可以找中间人介绍。

三、FutureTask

3.1、概述

未来的任务,用它干一件事,异步调用。main方法就像一个糖葫芦,一个个方法由main串起来。

问题:解决不了正常调用挂起引起的堵塞问题。

案例:

        (1)老师上着课,口渴了,去买水不合适,讲课线程继续,我可以单起个线程找班长帮忙买水,水买回来了放桌上,我需要的时候再去get;

        (2)4个同学,A计算1+20、B计算21+30、C计算31*到40、D计算41+50,是不是C的计算量有点大啊,FutureTask单起个线程给C计算,我先汇总ABD,最后等C计算完了再汇总

                 C,拿到最终结果;

        (3)高考:会做的先做,不会的放在后面做;

3.2、原理

        在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些任务交给FutureTask对象在后台完成,当主线程将来需要时,就可以通过FutureTask对象获得后台作业的计算结果或者执行状态。一般FutureTask对象多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
        仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。get方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。 
        只计算一次get方法放到最后。

3.3、案例代码

3.3.1、CallableThread

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 16:27
 * @Description: 王五计算21*22*23*...*25
 */
public class CallableThread implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        int sum = 1;
        for (int i = 21; i <= 25; i++) {
            sum *= i;
        }
        Thread.sleep(1);
        return sum;
    }
}

3.3.2、CallableMainApp

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/20 16:01
 * @Description:
 * 需求描述:
 *      三个同学安排任务如下:
 *          (1)张三计算 1+2+3+...+10
 *          (2)李四计算 11+12+13+...+20
 *          (3)王五计算 21*22*23*...*25
 *      把三个人的计算结果求和,求出总结果
 */
public class CallableMainApp {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> wangwuFutureTask = new FutureTask<>(new CallableThread());

        AtomicReference<Integer> zhangsanSumResult = new AtomicReference<>(0);
        AtomicReference<Integer> lisiSumResult = new AtomicReference<>(0);

        /**
         * 张三计算 1+2+3+...+10
         */
        new Thread(() -> {
            try {
                int zhangsanSum = 0;
                for (int i = 1; i <= 10; i++) {
                    zhangsanSum += i;
                }
                zhangsanSumResult.set(zhangsanSum);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "zhangsan").start();

        /**
         * 李四计算 11+12+13+...+20
         */
        new Thread(() -> {
            try {
                int lisiSum = 0;
                for (int i = 11; i <= 20; i++) {
                    lisiSum += i;
                }
                lisiSumResult.set(lisiSum);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "lisi").start();


        /**
         * 王五计算 21*22*23*...*25
         */
        new Thread(wangwuFutureTask, "wangwu").start();

        System.out.println("zhangsanResult = " + zhangsanSumResult.get());
        System.out.println("lisiResult = " + lisiSumResult.get());


        while (!wangwuFutureTask.isDone()) {
            System.out.println("=====================>王五拼命计算中");
        }
        Integer wangwuResult = wangwuFutureTask.get();
        System.out.println("wangwuResult = " + wangwuResult);

        Integer sum = zhangsanSumResult.get() + lisiSumResult.get() + wangwuResult;

        System.out.println("sum = " + sum);
    }

}

 

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

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

相关文章

JOSEF 同步检查继电器 JT-1 额定电压100V 柜内固定安装,板前接线

系列型号 JT-1同步检查继电器&#xff1b; DT-1同步检查继电器&#xff1b; JT-3同步检查继电器&#xff1b; DT-3同步检查继电器&#xff1b; DT-1/200同步检查继电器&#xff1b; DT-1/160同步检查继电器; DT-1/130同步检查继电器; DT-1/120同步检查继电器; DT-1/90…

Sentinel 系统规则 (SystemRule)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

js的高级

js js 的数组数组是什么为什么要使用数组数组的简单使用数组是按照顺序保存的&#xff0c;所以每个数据都有自己的编号数组的取值方法遍历数组数组的元素求和数组的最大值和最小值数组的增删改查操作数组的增加数组的筛选数组的删除js的函数 案例&#xff1a; 九九乘法表 数组…

在电脑PC端可以分类记笔记的软件选择哪个?

选择用电脑来记录笔记是比较便捷的&#xff0c;电脑屏幕比较大&#xff0c;操作起来比较便捷。但是很多人用电脑来记录笔记&#xff0c;通常会使用电脑上自带的记事本、文档记事工具来整合笔记&#xff0c;打开文档记事本类的软件&#xff0c;密密麻麻的文字呈现出来。 选择用…

社交媒体驱动的独立站流量增长:YouTube引流技巧

随着互联网的不断发展&#xff0c;视频内容在网上变得越来越受欢迎。YouTube作为世界上最大的视频分享平台之一&#xff0c;成为了吸引流量和观众的理想场所。对于跨境卖家来说&#xff0c;利用YouTube来增加独立站流量是一种有效的策略&#xff0c;可以增加知名度、吸引潜在客…

共享文件夹中无法打开文件怎么办

近年来&#xff0c;共享文件夹在企业和个人之间的使用越来越普遍。然而&#xff0c;许多用户常常会遇到一些问题&#xff0c;例如共享盘里的文件有的打不开。在本文中&#xff0c;我们将深入探讨这个问题&#xff0c;并为您提供解决方法。 首先&#xff0c;导致共享文件夹中文…

NX二次开发UF_CAM_ask_doc_template_name 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;里海NX二次开发3000例专栏 UF_CAM_ask_doc_template_name Defined in: uf_cam.h int UF_CAM_ask_doc_template_name(const char * * doc_template_filename ) overview 概述 This function provides the name of the file th…

【JS】BMI身体质量指数计算工具

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍BMI身体质量指数计算工具的JS实现。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

【dc-dc】世微 电动车摩托车灯 5-80V 1.2A 一切二降压恒流驱动器AP2915

产品描述 AP2915 是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出最大功率可达 12W&#xff0c;最大电流 1.2A。AP2915 一路灯亮切换两路灯亮&#xff0c;其中一路灯…

仅需1分钟,搭建一个你自己的工具站

{alert type"info"} 站长工具在工作中应该会有很多人使用&#xff0c;比如说 JSON格式化&#xff0c;UUID生成器&#xff0c;密码生成、URL编码等 今天给大家分享一个英文版的IT-TOOL的搭建教程。 是个开源的项目&#xff0c;地址&#xff1a;https://github.com/Cor…

140.【鸿蒙OS开发】

鸿蒙开发 (一)、初识鸿蒙1.初识鸿蒙(1).移动通讯技术的发展(2).完整的鸿蒙开发 (二)、鸿蒙系统介绍1.鸿蒙系统的官方定义(1).鸿蒙操作系统概述(2).鸿蒙的生态 2.鸿蒙系统的特点3.鸿蒙和安卓的对比4.鸿蒙开发的发展前景 (三)、鸿蒙开发准备工作1.鸿蒙OS的完整开发流程2.注册并实…

解放双手!推荐一款低代码工具,YYDS!

之前分享过一些低代码相关的文章&#xff0c;发现大家还是比较感兴趣的。之前在我印象中低代码就是通过图形化界面来生成代码而已&#xff0c;其实真正的低代码不仅要负责生成代码&#xff0c;还要负责代码的维护&#xff0c;把它当做一站式开发平台也不为过&#xff01; 面对这…

一书了解国产操作系统openEuler

操作系统是计算机之“魂” 数字化、智能化正在深刻地改变着我们的生活方式&#xff0c;也深刻地影响着世界格局。 支撑数字化、智能化的关键是数字基础设施&#xff0c;主要涉及数据中心、互联网、物联网、人工智能等新一代信息技术。 数字基础设施已成为保障产业格局、经济…

多模态机器学习81篇论文及源码合集(已分类整理)

多模态机器学习&#xff08;MultiModal Machine Learning, MMML&#xff09;是一种机器学习方法&#xff0c;它旨在解决复杂任务&#xff0c;如多模态情感分析、跨语言图像搜索等&#xff0c;这些任务需要同时考虑多种模态的数据并从中提取有用的信息。 得益于各种语言、视觉、…

sql注入 [极客大挑战 2019]HardSQL1

打开题目 输入1或者1"&#xff0c;页面均回显NO,Wrong username password&#xff01;&#xff01;&#xff01; 那我们输入1 试试万能密码 1 or 11 # 输入1 and 12 # 输入1 union select 1,2,3 # 输入1 ununionion seselectlect 1,2,3 # 输入1 # 输入1# 页面依旧回…

损失函数总结(十五):MSLELoss、RMSLELoss

损失函数总结&#xff08;十五&#xff09;&#xff1a;MSLELoss、RMSLELoss 1 引言2 损失函数2.1 MSLELoss2.2 RMSLELoss 3 总结 1 引言 在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss、MSELoss、BCELoss、CrossEntropyLoss、NLLLoss、CTCLoss、PoissonNLLLoss、Gau…

集成多元算法,打造高效字面文本相似度计算与匹配搜索解决方案,助力文本匹配冷启动[BM25、词向量、SimHash、Tfidf、SequenceMatcher]

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

优卡特脸爱云一脸通智慧管理平台权限绕过漏洞复现【CVE-2023-6099】

优卡特脸爱云一脸通智慧管理平台权限绕过漏洞复现【CVE-2023-6099】 一、 产品简介二、 漏洞概述三、 影响范围四、 复现环境五、 漏洞复现手动复现自动化复现(小龙POC开源) 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信…

Java 解压文件

maven库&#xff1a; <!--FileUtil、ZipUtil 依赖--> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.3.1</version> </dependency><!--IOUtils 依赖--> <depen…