【JUC】五、线程的第三种创建方式 Callable

文章目录

  • 1、Callable概述
  • 2、FutureTask

Java基础中,了解到的创建线程的两种方式为:

  • 继承Thread类
  • 实现Runnable接口

除了以上两种,还可以通过:

  • Callable接口(since JDK1.5)
  • 线程池方式

1、Callable概述

前面的Thread类或者Runnable接口方式创建线程,线程终止时,即run方法运行结束时,无法使线程返回结果,而Callable接口的优势正在于此。

在这里插入图片描述

而java.lang.Runnable是void run( ) 方法:

在这里插入图片描述

查看文档可以发现Thread的构造方法中,没有传Callable类型形参的,那就找个中间类:

在这里插入图片描述
Thread可以传入Runnable,Runnable有个实现类叫FutureTask,它的构造方法可以传Callable,这就是个Thread和Callable的中间人。

在这里插入图片描述

2、FutureTask

传入一个可调用的任务对象Callable,创建一个 FutureTask,一旦运行就执行给定的 Callable。

public FutureTask(Callable<V> callable)

关于FutureTask的理解,就是一个可取消的异步计算,单开一个线程去干其他事儿,到时候活儿干完了我在其它线程获取结果就行。这一点在之前的Runnable是实现不了的,它的run方法是void类型。

举个现实生活的例子:

老师在上课(线程A),突然口渴了(需要有一个其他计算任务),但老师不好停下课中途去买水,于是让班长一个人出去给他买水(单开一个线程),他继续上课,等班长回来,他就直接喝(计算完成后,在当前线程直接get另一线程的运行结果)。当然老师可能中途想到万一遇到校长就不妙了,于是在窗外喊住了班长,不让买了(计算结果未完成前,可以取消结果),也可能中途是想告诉班长不买水了,买包烟,于是也在窗外喊住了班长(计算结果未完成前,可以重新开始)。当然,如果这之前班长已经卖回来了,那老师就只能喝水了(一旦计算完成,就不能再重新开始或取消计算)。

FutureTask类的常用方法

  • 取消计算,若无法取消任务,则返回 false
public boolean cancel(boolean mayInterruptIfRunning)
  • 查询计算是否完成,FutureTask正常终止、异常或取消而完成均返回true
public boolean isDone()
  • 获取计算结果
public V get()
//重载,可传入一个最大等待时间

写个demo:

/**
 * Runnable
 */
class MyThread1 implements Runnable{
    @Override
    public void run() {

    }
}

/**
 * Callable
 */
class MyThread implements Callable<String>{
    @Override
    public String call() throws Exception {
        return "200";
    }
}
public class Demo1 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
    
        FutureTask<String> futureTask1 = new FutureTask<>(new MyThread());
        
        FutureTask<String> futureTask2 = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + " --> come in callable");
            return "1024";
        });
        
        new Thread(futureTask2,"t1").start();
        
        while (!futureTask2.isDone()){   //futuretask2未计算完成前,一直打印wait....
            System.out.println("wait.......");
        }
        
        System.out.println(futureTask2.get());  //在主线程中首次获取futuretask2所在线程的计算结果
        
        System.out.println(futureTask2.get());   //第二次获取计算结果
        
        System.out.println(Thread.currentThread().getName() + " --> come over");
    }
}

运行:

在这里插入图片描述

在其他FutureTask所在线程中获取下另外FutureTask所在线程的计算结果:

/**
 * Callable
 */
class MyThread2 implements Callable<String>{
    @Override
    public String call() throws Exception {
        System.out.println(Thread.currentThread().getName() + " --> come in callable");
        return "200";
    }
}
public class Demo1 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask<String> futureTask1 = new FutureTask<>(new MyThread2());
        FutureTask<String> futureTask2 = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + " --> come in callable");
            System.out.println("在futureTask1所在线程中获取futureTask1所在线程的计算结果:" + futureTask1.get());
            return "1024";
        });

        new Thread(futureTask1,"t1").start();
        new Thread(futureTask2,"t2").start();

        System.out.println("在main线程中获取futureTask1所在线程的计算结果:" + futureTask1.get());
        System.out.println("在main线程中获取futureTask2所在线程的计算结果:" + futureTask2.get());
        System.out.println(Thread.currentThread().getName() + " --> come over");
    }
}

运行:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript_表单校验用户名和密码

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title><style>*{margin: 0px;padding: 0px;box-sizing: border-box;}body{background: url("img/register_bg.png") …

1m照片尺寸怎么调?三个方法解决!

为了满足不同的需求&#xff0c;比如上传到网站、存储在移动设备上或传输给他人等&#xff0c;将照片尺寸调整到1M可以有效地减少照片占用的存储空间&#xff0c;同时保持相对较高的图像质量。下面三种好用的方法。 方法一&#xff1a;使用嗨格式压缩大师 1、打开软件&#xf…

thinkphp5 原生sql查询及取返回值

刚接触php&#xff0c;以前大量数据库都是直接写sql的&#xff0c;方便&#xff0c;好管理&#xff0c; 用thinkphp后&#xff0c;发现没有sql&#xff0c;对mvc模式还没深入了解&#xff0c;但这边要在上面写一些接口&#xff0c;有涉及数据库查询&#xff0c;修改等&#xf…

map\set封装

目录 1. set和map的底层结构1.1 红黑树1.2 set1.3 map 2. 模拟实现2.1 红黑树2.1 map和set以及仿函数2.3 迭代器2.3.1 const迭代器 2.3 set和map封装 1. set和map的底层结构 1.1 红黑树 这两个容器底层都是对红黑树的封装&#xff0c;因此需要先看一下红黑树结构部分的底层源…

基于免费敏捷工具Leangoo领歌的Scrum敏捷管理实践

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速创新…

医学生画图ppt

微信回复&#xff1a;素材 领取

中睿天下Coremail | 2023年Q3企业邮箱安全态势观察报告

10月25日&#xff0c;北京中睿天下信息技术有限公司联合Coremail邮件安全发布《2023年第三季度企业邮箱安全性研究报告》。2023年第三季度企业邮箱安全呈现出何种态势&#xff1f;作为邮箱管理员&#xff0c;我们又该如何做好防护&#xff1f; 以下为精华版阅读&#xff0c;如需…

Java日志规范总结

打印异常错误 正确应该是&#xff1a; 或者带上入参异常 没有意义的日志 最好带上参数&#xff0c;否则不知道这条日志代表什么意义。 日志不全 这种返回值日志尽量带上全部信息&#xff0c;排查的时候&#xff0c;只用错误信息是排查不出来问题的&#xff0c;顺丰那边…

【10套模拟】【3】

关键字&#xff1a; 物理存储、完全二叉树、出栈入栈时间复杂度、线索二叉树

数据同步工具调研选型:SeaTunnel 与 DataX 、Sqoop、Flume、Flink CDC 对比

产品概述 Apache SeaTunnel 是一个非常易用的超高性能分布式数据集成产品&#xff0c;支持海量数据的离线及实时同步。每天可稳定高效同步万亿级数据&#xff0c;已应用于数百家企业生产&#xff0c;也是首个由国人主导贡献到 Apache 基金会的数据集成顶级项目。 SeaTunnel 主…

跨境国际快递物流API:加速全球贸易的关键

引言 全球贸易的蓬勃发展在今日商业中扮演着至关重要的角色。而随着全球市场的扩大和商业界的日益复杂化&#xff0c;跨境国际快递物流API正成为推动全球贸易加速发展的关键因素。 为何说跨境国际快递物流API是加速全球贸易的关键&#xff1f; 连接全球商业网络 跨境国际快…

算法训练 第七周

一、最小栈 本题要求我们实现一个最小栈数据结构&#xff0c;要求它可以实现栈的基本功能&#xff0c;并且还能使用常数时间复杂度来获取栈中的最小值。 1.辅助栈 我们可以在普通栈的基础上再添加一个维护最小值的辅助栈来实现这个数据结构&#xff0c;我们先创建一个普通的栈…

【蓝桥杯选拔赛真题68】Scratch打地鼠游戏 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch打地鼠游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

目标检测,行人检测,出现了检测框和人物不在一起的情况,怎么解决---一定是配置文件的原因

今天测试发现人物检测有结果输出&#xff0c;但是发现检测出来的检测框和人物不匹配 但是奇怪的的是在orin中可以 再nx中就不行 结局复制所有orin的程序到nx就可以运行&#xff0c;最后对比配置文件发现是配置文件里不一样 dstest3_config.xml里的tiler不一样 orin中的 tiler: …

SAP ABAP 主动调用外部系统的REST接口(x-www-form-urlencoded)

如何在SAP ECC中调用外部系统提供的REST接口地址&#xff1f; Postman中使用Body中参数情况&#xff0c;使用链接的情况 x-www-form-urlencoded POST成功调用样例如下&#xff1a; SAP中实现如下&#xff1a; 1. 事务码STRUST,导入对方系统证书 2. 事务码SM59配置destinati…

接口测试需要验证数据库么?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

一篇美创科技“中国政务云数据安全领导者实践”案例,分享给大家

政务云作为数字政府建设的底座和基石&#xff0c;经过多年高速建设&#xff0c;已覆盖了我国80%以上地市及经济发达的县域。政务云的业务承载率、数据汇聚率不断提升&#xff0c;对数据安全的需求也进一步提高。加强政务云数据安全建设&#xff0c;成为政务云建设中不可绕过的关…

SpringBoot项目集成发邮件功能

1&#xff1a;引入依赖2&#xff1a;配置设置3&#xff1a;授权码获取&#xff1a;4&#xff1a;核心代码5&#xff1a;postman模拟验证6&#xff1a;安全注意 1&#xff1a;引入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>c…

【云上探索实验室】快速入门AI 编程助手 Amazon CodeWhisperer ——码上学堂领学员招募

目录 一、Amazon CodeWhisperer1.1、大语言模型与AI编程1.2、CodeWhisperer初体验 二、云上探索实验室-码上学堂2.1、码上学堂2.2、学课通道入口 三、领学员招募3.1、报名方式3.2、领学奖励 一、Amazon CodeWhisperer 1.1、大语言模型与AI编程 大语言模型&#xff08;Large L…

图形学中的噪声

1 value noise 四个点取随机数然后做插值。 float random (in vec2 st) {return fract(sin(dot(st.xy,vec2(12.9898,78.233)))* 43758.5453123); }float noise (in vec2 st) {vec2 i floor(st);vec2 f fract(st);float a random(i);float b random(i vec2(1.0, 0.0));fl…