【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{@Overridepublic void run() {}
}/*** Callable*/
class MyThread implements Callable<String>{@Overridepublic 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>{@Overridepublic 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.hqwc.cn/news/189314.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【uniapp】Google Maps

话不多说 直接上干货 提前申请谷歌地图账号一、新建地图 使用h5获取当前定位或者使用三方uniapp插件 var coords ""navigator.geolocation.getCurrentPosition(function(position) {coords {lat: position.coords.latitude,lng: position.coords.longitude};lats …

数据资产到底如何入表?

2024年1月1日起&#xff0c;财政部《企业数据资源相关会计处理暂行规定》正式施行&#xff0c;距离现在只有一个多月的时间。 数据资源入表意味着企业可以将数据资源确认为企业资产负债表中“资产”一项。对于拥有丰富数据资源的企业来说&#xff0c;有望在财务报表中体现其真…

ssm+vue的物流配送管理系统(有报告)。Javaee项目,ssm vue前后端分离项目

演示视频&#xff1a; ssmvue的物流配送管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介…

【日常】爬虫技巧进阶:textarea的value修改与提交问题(以智谱清言为例)

序言 记录一个近期困扰了一些时间的问题。 我很喜欢在爬虫中遇到问题&#xff0c;因为这意味着在这个看似简单的事情里还是有很多值得去探索的新东西。其实本身爬虫也是随着前后端技术的不断更新在进步的。 文章目录 序言Preliminary1 问题缘起1.1 Selenium长文本输入阻塞1.2…

CSS特效013:背景色彩不停流动效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

uniapp App 端 版本更新检测

function checkVersion() { var req { //升级检测数据 appid: plus.runtime.appid, version: plus.runtime.version }; const timestamp Date.parse(new Date()); config.server.query_news uni.reque…

Ubuntu18.04安装Moveit框架

简介 Moveit是一个由一系列移动操作的功能包组成的集成化开发平台,提供友好的GUI,是目前ROS社区中使用度排名前三的功能包,Moveit包含以下三大核心功能,并集成了大量的优秀算法接口: 运动学:KDL,Trac-IK,IKFast...路径规划:OMPL,CHMOP,SBPL..碰撞检测:FCL,PCD... 一、更新功…

新品首发 | HP1011:高性能双相交错 PFC 数字控制器

随着PFC技术的发展&#xff0c;不断有新型PFC拓扑结构提出&#xff0c;如单相PFC、交错并联 PFC、传统无桥PFC、图腾柱无桥 PFC等。交错Boost PFC系统不仅具有并联系统的所有优点&#xff0c;还能减少输入电流纹波&#xff0c;降低开关管的电流应力。在中大功率场所通常采用工作…

复杂数据统计与R语言程序设计实验二

1、创建一个对象&#xff0c;并进行数据类型的转换、判别等操作&#xff0c;步骤如下。 ①使用命令清空工作空间&#xff0c;创建一个对象x&#xff0c;内含元素为序列&#xff1a;1&#xff0c;3&#xff0c;5&#xff0c;6&#xff0c;8。 ②判断对象x是否为数值型数据。 ③…

防抖-节流-深拷贝-事件总线

一、防抖与节流 1.认识防抖与节流函数 防抖和节流的概念其实最早并不是出现在软件工程中&#xff0c;防抖是出现在电子元件中&#xff0c;节流出现在流体流动中 而JavaScript是事件驱动的&#xff0c;大量的操作会触发事件&#xff0c;加入到事件队列中处理。而对于某些频繁…

C语言变量与常量

跟着肯哥&#xff08;不是我&#xff09;学C语言的变量和常量、跨文件访问、栈空间 栈空间还不清楚&#xff0c;期待明天的课程内容 C变量 变量&#xff08;Variable&#xff09;是用于存储和表示数据值的名称。 主要包括四个环节&#xff1a;定义、初始化、声明、使用 在我刚…

代码随想录算法训练营第三十八天【动态规划part01】 | 动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划理论基础 什么是动态规划 动态规划 (Dynamic Programming, DP)&#xff0c;是求解决策过程最优化的过程。 如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪…