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

news2024/10/7 11:29:59

文章目录

  • 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");
    }
}

运行:

在这里插入图片描述

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

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

相关文章

你的Edge浏览器难道不需要一个好看的浏览器起始页嘛

这是我登录后&#xff0c;并且上传了个人壁纸的页面 Br标签页 一 . 我们来看看界面和功能1.注册登录2.首页及右键功能3.添加小组件和app网址4.切换壁纸5. 计划页面 二 . Edge浏览器安装和chrome&#xff08;谷歌&#xff09;浏览器安装1. Edge浏览器安装2. chrome&#xff08;谷…

Ubuntu安装mysql(解决ubuntu Access denied for user ‘root‘@‘localhost‘报错)

1、安装mysql sudo apt-get install mysql-server 上述命令会安装以下包&#xff1a; apparmor mysql-client-5.7 mysql-common mysql-server mysql-server-5.7 mysql-server-core-5.7 因此无需再安装mysql-client等。安装过程会提示设置mysql root用户的密码&#xff0c;设…

Linux系统编程——进程的创建

函数名 fork&#xff1a;创建一个子进程 函数原型 pid_t fork(void); 调用该函数时&#xff0c;需包含以下头文件 #include <unistd.h>返回值 fork函数调用成功&#xff0c;返回两次PID &#xff08;1&#xff09;返回值为0&#xff0c;代表当前进程是子进程 &am…

笔记:如何用趋动云GPU线上跑AI项目实践-部署DragGan模型

1.创建项目 1&#xff09;进入趋动云用户工作台&#xff0c;在当前空间处选择注册时系统自动生成的空间&#xff08;其他空间无免费算力&#xff09;&#xff1b; 2&#xff09;点击 快速创建&#xff0c;选择 创建项目&#xff0c;创建新项目&#xff1b; 3&#xff09;填写…

【游戏开发算法每日一记】使用随机prime算法生成错综复杂效果的迷宫(C#,C++和Unity版)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

RT-Thread系列10——ETH网口设备

文章目录 1. ETH测试第一步&#xff1a;cubemx配置。第二步&#xff1a;board.h配置。第三步&#xff1a;rtthread settings配置第四步&#xff1a;以太网复位引脚设置第五步&#xff1a;修改rtthread源码第六步&#xff1a;修改 cubemx 生成的 main 函数第七步&#xff1a;编译…

【MATLAB源码-第76期】基于matlab的OCDM系统在AWGN信道下理论误码率和实际误码率对比仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 正交线性调频分频复用&#xff08;OCDM&#xff0c;Orthogonal Chirp Division Multiplexing&#xff09;是一种无线通信技术&#xff0c;它基于啁啾信号的原理。啁啾信号是一种频率随时间变化的信号&#xff0c;通常频率是线…

Ant Design Vue Select下拉框内容显示不全问题解决

默认情况下&#xff0c;当下拉框的内容长度过长时&#xff0c;会被折叠&#xff0c;这比较影响用户体验&#xff0c;查了下文档&#xff0c;看到有一个属性可以解决这个问题&#xff1a; 没设置的下拉效果&#xff1a; 设置完之后&#xff1a;dropdownMatchSelectWidth{false}&…

在Qt设计师(Qt Designer )控件面板加入自定义控件

目录 1. 问题的提出 2. 本次开发环境说明 3. 具体实现 4. 注意的问题 5. 参考链接 1. 问题的提出 在Qt开发中&#xff0c;经常利用Qt设计师&#xff08;Qt Designer &#xff09;把界面设计好&#xff0c;将界面放到ui文件中&#xff0c;将逻辑处理放到cpp文件中&#xff…

记录第一次利用CVE-2023-33246漏洞实现RocketMQ宿主机远程代码执行的兴奋

我依然记得自己第一次发现xss漏洞时候的兴奋: 我也记得自己第一次发现sql输入时候的快乐: 直到最近我终于收获了人生的第一个远程代码执行漏洞的利用&#xff08;RCE:remote code execute&#xff09;&#xff0c;虽然这个漏洞的危害远超过了前两个&#xff0c;但是快乐不如前…

基于非对称纳什谈判的多微网电能共享运行优化策略(附带MATLAB程序)

基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 参考文献&#xff1a; 《基于非对称纳什谈判的多微网电能共享运行优化策略》——吴锦领 资源地址&#xff1a; 基于非对称纳什谈判的多微网电能共享运行优化策略MATLAB程序 MATLAB代码&#xff1a;基于非对称纳什…

微信小程序:tabbar、事件绑定、数据绑定、模块化、模板语法、尺寸单位

目录 1. tabbar 1.1 什么是tabbar 1.2 配置tabbar 2. 事件绑定 2.1 准备表单 2.2 事件绑定 2.3 冒泡事件及非冒泡事件 3. 数据绑定 3.1 官方文档 4. 关于模块化 5. 模板语法 6. 尺寸单位 1. tabbar 1.1 什么是tabbar 下图中标记出来的部分即为tabbar&#xff1a…

2023年华为杯数学建模E题——代码复盘(第一问)

2023年华为杯数学建模E题 代码复盘 写在最前面目录问题1a计算时间间隔思路说明代码输出结果 插值求解思路代码输出结果 绘图绘制3D图&#xff08;待修改&#xff09; 问题1b数据预处理思路代码 模型训练思路代码输出结果网格调参代码输出结果 写在最前面 超开心又有点遗憾 结果…

matlab二维曲面散点图插值方法

在 MATLAB 中&#xff0c;你可以使用以下函数进行二维曲面散点插值&#xff1a; griddata: 该函数可以在散点数据上进行二维插值&#xff0c;生成平滑的曲面。它支持多种插值方法&#xff0c;包括三次样条插值、最近邻插值、线性插值和自然邻近法插值。 scatteredInterpolant:…

《RT-DETR魔术师》专栏介绍 CSDN独家改进创新实战 专栏目录

RT-DETR魔术师专栏介绍&#xff1a; https://blog.csdn.net/m0_63774211/category_12497375.html ✨✨✨魔改创新RT-DETR &#x1f680;&#x1f680;&#x1f680;引入前沿顶会创新&#xff08;CVPR2023&#xff0c;ICCV2023等&#xff09;&#xff0c;助力RT-DETR &#…

专题知识点-二叉树-(非常有意义的一篇文章)

这里写目录标题 二叉树的基础知识知识点一(二叉树性质 )树与二叉树的相互转换二叉树的遍历层次优先遍历树的深度和广度优先遍历中序线索二叉树二叉树相关遍历代码顺序存储和链式存储二叉树的遍历二叉树的相关例题左右两边表达式求值求树的深度找数找第k个数二叉树非递归遍历代码…

微信小程序 生命周期方法 页面路由 开发示例 自定义全局数据 链接跳转

目录 1. 生命周期方法 2. 页面路由 3. 开发示例 3.1 自定义全局数据 3.2 链接跳转 1. 生命周期方法 打开app.js Page生命周期函数 下面的Page生命周期图与上面的Page生命周期函数进行对比便于理解&#xff1a; 视图线程和应用服务线程会同时运行&#xff0c;应用服务线程…

微信个人号api接口开发

请求URL&#xff1a; http://域名地址/sendFile 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wId是string登录实例标识wcId是string接收…

【保姆级教程】Linux安装JDK8

本文以centos7为例&#xff0c;一步一步进行jdk1.8的安装。 1. 下载安装 官网下载链接&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8 上传jdk的压缩包到服务器的/usr/local目录下 在当前目录解压jdk压缩包&#xff0c;如果是其它版本&#xf…

Nessus漏洞扫描工具

Nessus 1、官网下载安装包2、centos7 安装Nessus3、启动Nessus4、网页访问88435、离线激活工具6、其他问题7、漏洞扫描使用 Nessus 是全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus 作为扫描该机构电脑系统的软件。 1、官网下载安装包 官网下载…