线程学习2:带返回值的线程Callable和FutureTask

Java多线程研究06-带返回值的线程定义接口Callable以及Future,FutureTask的使用 带返回值的CallableJAVA线程相关的Runnable接口中的run()方法没有提供返回值,如下:...... public void run() { ...... } ......如果需要在线程A执行完成,得到返回值后,再继续执行某个业务。那么推荐使用JDK1.5中提供的带有“执行返回值”的线程定义接口:Callable。如果还需要为多个线程的执行调度加入更复杂的控制逻辑,那么需要我 阅读详情
package com.research;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 有返回值的多线程测试
 * 方法2:使用ExecutoreService提供了submit()方法,传递一个Callable,返回Future。
 */
public class CallbleTest {
    public static void main(String[] args) throws Exception {
        System.out.println("----程序开始运行----");
        Date date1 = new Date();
        // 创建一个线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);
        try {
            Callable c = new MyCallable("【异步线程日任务】");
            /*执行任务并获取Future对象,ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,
            返回Future。如果Executor后台线程池还没有完成Callable的计算,
            这调用返回Future对象的get()方法,会阻塞直到计算完成。*/
            Future f = pool.submit(c);

            System.out.println("主线程进行业务操作----->");
            System.out.println("balabalabalabala........");
            Thread.sleep(5000);
            System.out.println("<-----主线程业务操作结束");

            // 从Future对象上获取任务的返回值
            System.out.println("获得异步线程结果--->" + f.get().toString());
            Date date2 = new Date();
            System.out.println("----程序结束运行----,程序运行时间【"
                    + (date2.getTime() - date1.getTime()) + "毫秒】");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭线程池
            pool.shutdown();
        }

    }
}

class MyCallable implements Callable<Object> {
    private String taskNum;
    MyCallable(String taskNum) {
        this.taskNum = taskNum;
    }
    public Object call() throws Exception {
        System.out.println(">>>" + taskNum + "任务启动");
        Date dateTmp1 = new Date();
        Thread.sleep(1000);
        Date dateTmp2 = new Date();
        long time = dateTmp2.getTime() - dateTmp1.getTime();
        System.out.println(">>>" + taskNum + "任务终止");
        return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
    }
}
package com.research;

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

/**
 * 有返回值的多线程测试(不需要创建线程池)
 * 方法1:使用 FutureTask 类来包装 Callable 对象,该 FutureTask 对象封装了该
 * Callable 对象的 call() 方法的返回值。使用 FutureTask 对象作为 Thread
 * 对象的 target 创建并启动新线程。调用 FutureTask 对象的 get() 方法来获
 * 得子线程执行结束后的返回值。
 */
public class FutureTaskTest {

    public static void main(String[] args) throws Exception {
        FutureTaskCall ctt = new FutureTaskCall(99);
        FutureTask<Integer> ft = new FutureTask<>(ctt);

        new Thread(ft).start();

        System.out.println("主线程进行业务操作----->");
        System.out.println("balabalabalabala........");
        Thread.sleep(5000);
        System.out.println("<-----主线程业务操作结束");

        System.out.println("子线程的返回值:" + ft.get());
    }
}


class FutureTaskCall implements Callable<Integer> {

    private Integer taskNum;

    FutureTaskCall(Integer taskNum) {
        this.taskNum = taskNum;
    }


    @Override
    public Integer call() throws Exception {
        // 线程需要完成的任务
        System.out.println(">>>" + taskNum + "任务启动");
        Date dateTmp1 = new Date();
        Thread.sleep(1000);
        Date dateTmp2 = new Date();
        long time = dateTmp2.getTime() - dateTmp1.getTime();
        System.out.println(">>>" + taskNum + "任务终止");
        return taskNum*100;
    }
}

 

Callable带返回值接口使用 Callable带返回值接口使用 大厂面试题: 1、请你谈谈对volatile的理解? 2、CAS你知道吗? 3、原子类AtomicInteger的ABA问题谈谈?原子更新引用知道吗? 4、我们都知道ArrayList是线程不安全的,请编码写一个不安全的案例并给出解决方案? 5、公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁。 6、CountDownLatc... 阅读详情

相关推荐

Future、Callable、FutureTask、Runnable它们的关系你弄懂了吗

引言 看到标题一下子好几个名称,很可能你都知道、都听过、看过,但是你真是理清楚了它们的关系了吗? 在这个知识泛滥、技术焦虑的时刻,人人嘴里喷着高并发、大数据、分布式,很多估计对这个一头雾水,无论在开发还是面试过程中,一知半解还不如不知。 Runnable/Thread 通常情况下的耗时操作会交给多线程来处理,Java中开启一个新线程很容易,继承自Thread或实现Runnable接口。下面是...

kxkxyzyz的博客 1218

Java多线程之 FutureTask:带有返回值的函数定义和调用

之前使用的方法都是没有返回值的。很多时候,我们是有返回值的,为了解决这个问题,Java提供了一个FutureTask 类,用于定义带有返回值的任务。 以下代码演示了定义和调用的整个过程。 import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class CallableDemo {...

郝伟老师的博客——大数据、并行计算与人工智能时代 1665

Java多线程(二):Callable和FutureTask结合使用获取返回值

1. Callable 话不多说,直接上源码: @FunctionalInterface public interface Callable<V> { V call() throws Exception; } 跟上一篇讲的 Runnable 一样,Callable 也是一个函数式接口。此外,Callable 还是泛型类,可以指定 call 方法的返回值类型。 Callable 源码过于简单,看不出什么,下面我们再介绍一个类:FutureTask 2. FutureTask 2.1 F

qq_28834355的博客 1316

04_线程的创建和启动_使用Callable和Future的方式

【简述】 从java5开始,java提供了Callable接口,这个接口可以是Runnable接口的增强版, Callable接口提供了一个call()方法作为线程执行体,call()方法比run()方法功能更强大。 【call()方法特点】 1.call()方法可以有返回值 2.call()方法可以声明抛出异常。 【Future接口】 java5提供了Future接口来...

weixin_30810239的博客 421

EBS开发_离散工单创建API

--以下代码于20171213在TONY环境中实现 DECLARE     l_iface_rec    wip.wip_job_schedule_interface%ROWTYPE; --工单任务接口表     l_group_id     NUMBER;     l_returnstatus VARCHAR2(40);     l_errormsg     VARCHAR2(2000

蜗牛先生快跑的博客 2596

OpenCV函数用法之calibrateCamera

参考链接:opencv中标定函数calibrateCamera_ychl87的专栏-优快云博客 世界坐标系的三维点投影到成像坐标系中的二维点的投影公式如下: 其中(X,Y,Z)为世界坐标系中的三维点; (u,v)为成像面坐标系中的二维点; A为相机的内参数矩阵:(cx,cy)为主光轴点,一般为图像的中心;fx和fy为焦距; [R|t]为相机的外参数矩阵:R为旋转矩阵,t为位移矩阵; 上述公式的简单推理过程如下 考虑到镜头畸变 其中,k1,k2,k3,k4,k5和k6为径向畸变,p1和.

tiger&sheep的博客 3万+

通过Callable和FutureTask创建线程

一、使用步骤 虽然Runnable接口实现多线程比继承Thread类实现多线程方法要好,但是Runnable接口里的run方法并不能返回操作结果。为了解决这样的矛盾,java提供了Callable接口。 创建并启动有返回值的线程的步骤如下: 创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该call()方法有返回值,再创建Callable实现类的实例 使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象

kking_edc的博客 2419

告别“为了写而写”:GJB438C-2021新规下,软件文档如何真正为项目服务?

本文深入解析GJB438C-2021新规如何重构软件文档的实战价值,通过文档体系瘦身、流程再造和敏捷化实践,显著提升军工软件项目的效率。新标准删除30%冗余文档,引入动态编制法和轻量化模板,使文档编制工作量降低37%,关键路径周期缩短15%。

weixin_30765577的博客 447

Callable多线程Future、FutureTask、ExecutorService学习

Java 1.5 这个神奇的版本推出了 Callable 接口。主线程等待获取 Future 结果。提交 Callable 到线程池。

黄彪博客 1378

【数字逻辑电路课程设计】多功能数码管时钟VHDL+quartus II-EP1C12F324C8+源码+付费资源

我希望需要我这篇文章的是正常学习数字逻辑课程且正在设计数码管时钟的同学。我个人不推荐直接获取源代码,因此我另有一份付费资源是完整源代码;我推荐各位去研究我代码的逻辑尝试自己书写属于自己的代码,因此我保留了注释但隐去了变量。由于时间有限,我的设计不够完美,仍有很多缺陷,我将我的展望写在后面,各位可以尝试实现。我不为难同学,作为同学我理解各位设计的辛苦,因此如果有需要,私信我提供隐去敏感信息的学生证照片可直接获取源代码。

WannaFlysyx的博客 1533

如何利用Arcgis进行地统计学分析(三):空间插值方法选择与优化

本文深入探讨了在Arcgis中进行地统计学分析时,如何根据探索性数据分析(EDA)结果科学选择与优化空间插值方法。文章对比了IDW、RBF、克里金等主流方法的适用场景与核心参数,并通过实战案例详解了从数据诊断到模型调优的完整流程,强调结合半变异函数与趋势分析进行“对症下药”,以提升插值结果的精度与可靠性。

weixin_29281915的博客 120

Callable 和 FutureTask 带返回值线程使用和源码分析

Callable 和 FutureTask 可以创建带返回值的线程,那它是怎么实现的呢?笔者下面分析,先看看它是怎么使用的。

悟世君子的博客 716

反无人机技术实战解析:从探测到拦截的全方位防御策略

本文深入解析了反无人机(C-UAS)技术的全链条防御策略。从雷达、无线电频谱、光电等多维度探测技术,到数据融合与威胁评估,再到无线电干扰、导航诱骗及物理拦截等核心拦截手段,系统阐述了如何构建从探测到拦截的实战化防御体系,为关键设施、大型活动等场景提供定制化空域安全解决方案。

weixin_29230649的博客 401

Java多线程带返回值的Callable接口

Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两个线程同时来调用同一个计算对象,计算对象的call方法会被调用几次你知道吗?如果这些你知道,那么凯哥(凯哥Java:kaigejava)恭喜你,本文你可以不用看了。如果你不知道这些,那么凯哥同样要恭喜你,看了凯哥这篇文章之后,就知道这些了。来看看这篇文章我们能学到什么 本节主要内容 一:三种获取多线程的的

1706

经纬度转换为UTM坐标

UTM(通用横向墨卡托投影): 是一种以米为单位的坐标系统,用于地图和GPS导航。将地球划分为60个纵向的区域。每个区域宽6度,从赤道开始往南北两级方向划分。每个区域都有一个特定的字母。

weixin_45626706的博客 7275

组建高效AI开发团队:角色、技能与协作

在当今科技飞速发展的时代,人工智能(AI)已经成为各个领域的核心驱动力。组建高效的AI开发团队对于企业和科研机构来说至关重要,它能够推动创新、提高竞争力、实现业务目标。本文的目的在于为那些希望组建或优化AI开发团队的管理者、技术负责人以及相关从业者提供全面的指导。范围涵盖了团队角色的定义、所需技能的分析、团队协作的策略,以及实际项目中的应用和相关资源的推荐。本文将首先介绍AI开发团队的核心概念与联系,包括团队角色、技能和协作之间的关系。接着阐述核心算法原理和具体操作步骤,结合数学模型和公式进行详细讲解。

2502_91592937的博客 995

java多线程:Callable配合FutureTask实现创建异步任务并且获取其返回值

Future表示一个异步计算的结果。它提供了一种访问异步操作的结果的方式,以便在主线程中获取异步计算的结果。cancel(boolean): 取消任务。传入的参数为表示若任务开始执行了,是否要尝试中断该线程。参数true为进行尝试中断,false为不进行中断。isCanceled(): 获取该任务是否被中断了isDone(): 该任务是否已经完成get(): 获取该任务的返回值,若任务还未完成则会阻塞。get(Long, TimeUnit): 获取任务的返回值,若任务还未完成则会阻塞。

m0_74229735的博客 1866

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java多线程:callable和futureTask获取异步任务的返回值(实现并行计算)

场景: 我们要计算1+…+10和20+…+30相加的结果,当然可以用a=1+…+10,b=20+…+30,之后resutl=a+b。 但实际上第一个任务A和第二个任务B互不影响, 我们可以使用多线程的方法,将任务A和任务B并行执行,最后将两个任务的执行结果相加。那这样怎么用java实现呢? 引言: 在之前的 java多线程入门 中介绍了java创建多线程的方法,本质上就一种:通过Thread thread = new Thread(Runnable)创建新线程对象,实现的Runnable的run方法则为们

qq_41257358的博客 7554

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一文彻底搞懂:Runnable、Callable、Future、FutureTask 之间的关系

Java并发编程中的Runnable、Callable、Future和FutureTask详解:Runnable是最基础的任务接口,无返回值;Callable是其增强版,支持返回值和异常抛出。Future作为异步结果的凭证,提供任务状态查询和结果获取功能。FutureTask巧妙地将Runnable和Future结合,既能执行任务又能保存结果。线程池的submit()方法会自动将Callable包装成FutureTask执行。这套体系构成了Java异步任务处理的核心模型,FutureTask作为关键桥梁,支

Mark Wu 的博客 1644

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Callable和FutureTask的使用

1 Callable 接口 接口内部仅有一个call()方法,方法返回类型为接口泛型定义的类型。实现类重写内部方法后,通过Future接口的包装类进行包装,来实现Runable接口,从而能够开启新的线程。与Runable不同的是:Runable执行的run()方法返回值是void,如果在工作需要中需要通过分线程获取执行结果,Runable就不能满足需求了。Callable接口通过泛型能够控制call的返回类型,因此,需要有返回的时候通常使用Callable。 实现类如下图例:(如果cal..

a1105575699的博客 3400

【并发编程系列13】Future/Callable/FutureTask:线程池也是可以有返回值的

Future/Callable/FutureTask原理分析前言Future/Callable初体验Callable用法Future用法Callable和Future原理分析Callable原理分析Future原理分析FutureTask分析如何利用FutureTask/Callable创建线程FutureTask状态分析线程池的submit方法和execute方法区别总结 前言 之前我们介绍线程的基础知识以及线程池的时候,所有的线程都有一个共同的特点,那就是只管执行,我们不知道是否执行成功,也拿不到线程执

zwx900102的博客 1401

Java 多线程中的 Callable、Future 和 FutureTask 详解

本文详细介绍了如何在 Java 中使用 `Callable`、`Future` 和 `FutureTask` 来获取多线程执行结果。通过 `Callable` 接口,我们可以定义一个有返回值的任务;通过 `Future` 接口,我们可以异步获取任务的执行结果;通过 `FutureTask` 类,我们可以将 `Callable` 任务包装成一个可执行的任务,并获取其执行结果。

专注Java和MySQL领域知识分享 1393

使用Callable和Future创建线程

一点睛 从Java 5开始,Java提供了Callable接口,该接口是Runnable接口的增强版,Callable接口提供了一个call()方法,可以看作是线程的执行体,但call()方法比run()方法更强大。 call()方法可以有返回值。 call()方法可以声明抛出异常。 创建并启动线程的步骤如下: 1创建Callable接口的实现类,并实现call()方法...

实践求真知 4514

必备知识点:FutureTask+Callable 实现带返回值的多线程

简介创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种方式都有个缺点,那就是在任务执行完成之后无法获取返回结果.那如果我们想要获取返回结果该如何实现呢?Executor框架结构中提到的Callable接口和Future接口,从Java SE 5.0开始引入了Callable和Future,通过它们构建的线程,在任务执行完成后就可以获取执行结果。1.runna...

Java精选 1004

【异步编程基础】Callable与FutureTask:Callable返回结果,FutureTask等待线程执行并拿到结果

【异步编程基础】Callable与FutureTask:Callable返回结果,FutureTask等待线程执行并拿到结果

hiliang521的博客 1099

Java 通过线程池运行Runnable Callable FutureTask,通过Future获取返回值

Callable是可以获取返回值的Runnable,不过Callable只能通过线程池,来直接的提交任务。 如果通过Runnable来执行任务,则只能通过FutureTask来获取返回值。 线程池ExecutoerService的execute()方法,只接收Runnable入参。要想获取任务返回值,只能通过FutureTask。 submit()方法,可以接收Runnable和Callable入参。获取返回值,既可以通过Future+Callable,也可以通过FutureTask+Runnab

linewon 2229
上一篇: 线程学习1:ThreadLocal的使用
下一篇: 线程学习3:ThreadGroup线程组
JavaMrSun
博客等级 码龄9年 27粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值