Callable、Future和FutrueTask详解

一、Callable介绍

1.1 Runnable介绍

Runnable是一个接口,里面声明了run方法。但是由于run方法返回值类型为void,所以在执行完成任务后,无法返回任何结果。

@FunctionalInterface
public interface Runnable {public abstract void run();
}

1.2 Callable介绍

callable位于java.util.concurrent包下,它是一个接口,这个接口下面只有一个call()方法。它是一个泛型接口,可以有返回值,也可以抛出异常

public interface Callable<V> {V call() throws Exception;
}

二、怎么使用Callable?

2.1 借助FutureTask执行

        2.1.1 Future介绍

        Future是一个接口,它可以对于具体的Runnable获取Callable任务的执行结果进行取消,查询是否完成,获取结果。必要时可以通过get()方法获取执行结果,该方法会阻塞直到任务返回结果。

2.1.2 Future源码解析

package java.util.concurrent;public interface Future<V> {/*** 用来取消任务,如果取消任务成功,就返回true,如果失败,就返回false* @param mayInterruptIfRunning 表示是否取消正在执行却没有执行完毕的任务,如果设置了ture,则表示可以*                              取消正在执行过程中的任务* 如果任务正在执行,若mayInterruptIfRunning为ture,则返回true,若mayInterruptIfRunning为ture为false* 不会取消任务,返回false,如果任务还没有执行,不管若mayInterruptIfRunning为ture还是false,都返回ture* 如果任务已完成,则无论不管若mayInterruptIfRunning为ture还是false,一定返回false*/boolean cancel(boolean mayInterruptIfRunning);/*** 如果此任务在正常完成之前被取消,则返回true*/boolean isCancelled();/*** 如果此任务完成,则返回true*/boolean isDone();/*** 等待任务完成,然后返回其结果,是一个阻塞的方法*/V get() throws InterruptedException, ExecutionException;/*** 如果在指定的时间内,还没有获取到结果,则返回null*/V get(long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;}

2.1.3 总结

  • Future能够判断任务是否完成
  • Future能够中断任务执行
  • Future获取任务执行结果

2.1.3 FutureTask介绍

  • 由于Future是一个接口,无法用来直接创建对象使用,所以我们在使用过程中一般都是通过FutureTask来进行实现
  • FutureTask类实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable和Future接口,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable返回值。
  • FutureTask可以用来包装Callable或者Runnable对象。因为FutureTask实现了Runnable接口,所以FutureTask也可以提交给Executor

 2.1.4 FutureTask三种状态

  • 未启动:创建了FutureTask对象,但FutureTask.run()还未执行之前
  • 已启动:FutureTask对象的run启动并执行过程中
  • 已完成:FutureTask正常结束,或者FutureTask执行被取消(FutrueTask对象的cancel方法),或者FutureTask对象run方法执行抛出异常导致中断而结束,FutureTask都处于已完成的状态

2.2.1 Callable使用案例

Callable使用方式有两种,一种是通过线程池,一种是线程直接调用

线程池介绍和线程池工具类代码

 线程池工具类_java线程池工具类-CSDN博客

public class MyCallable  implements Callable{@Overridepublic Object call() throws Exception {System.out.println("开始对0—100和计算");int sum = 0;for (int i = 0;i < 101; i++) {sum = sum + i;}return sum;}
}
public class MyCallableTest {public static void main(String[] args) throws ExecutionException, InterruptedException {MyCallable myCallable = new MyCallable();System.out.println("----------------利用线程池进行调用---------------------");Future<Integer> future = ThreadPoolUtils.submit(myCallable);System.out.println(future.get());System.out.println("-----------------FutureTask调用------------------------");FutureTask futureTask = new FutureTask(myCallable);//new Thread(futureTask).start();futureTask.run();System.out.println(futureTask.get());}
}

 2.2.2 执行结果

 

参考文档:FutureTask详解-CSDN博客

JAVA多线程—Callable详解_callable java-CSDN博客 

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

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

相关文章

格雷希尔针对J2044燃油管测试专用快速接头都有哪些及各自的应用场合

J2044燃油管是汽车燃油系统中常见的管口&#xff0c;如&#xff1a;燃油泵、燃油滤清器、喷油嘴等部件中都有这样的管口&#xff0c;为了保证燃油系统的正常运行&#xff0c;这些零部件在出厂前就需要对其进行多种测试&#xff0c;在测试前需要对J2044燃油管管口进行密封用于连…

代码块-Java

代码块-Java 一、介绍二、语法三、好处举例 四、使用细节1、static代码块/静态代码块&#xff0c;随着类的加载而执行&#xff0c;且只执行一次2、 类什么时候被加载 [重要 ! ]案例演示&#xff1a;static代码块 3、普通代码块&#xff0c;在创建对象实例时&#xff0c;会被隐式…

OpenCV检测圆形东西是否存在缺口?

文章目录 前言一、试过的方法二、最终使用的方法1.先极坐标变换2.计算斜率 总结 前言 想了挺久&#xff0c;一直没解决这个问题。后面勉强解决了。 一、试过的方法 1.想用圆度来解决&#xff0c;后来发现圆度差值很小&#xff0c;完整的圆圆度0.89&#xff0c;然后有缺角的圆圆…

初学vue3与ts:setup与setup()下的数据写法

把setup写在script里 <template><div><div class"index-title">script setup</div><div class"title">字符串&#xff1a;</div><div class"title-sub">ref版&#xff1a;{{strRef}}</div><…

Vue3挂载完毕后,隐藏dom再重新加载组件的方法

组件原本是在PC端使用的&#xff0c;现在需要把组件再封装一次&#xff0c;供app调用&#xff0c;但是在app上会显示tag栏&#xff0c;有占位影响空间&#xff0c;所以需求去掉头部tag&#xff0c;只显示下方组件。 实现方法&#xff0c;以前是直接引用的组件&#xff0c;现在改…

minio客户端基本操作

minio客户端基本操作 桶 创建桶 如果要创建新的桶 输入名称&#xff0c;点击创建即可&#xff0c;默认权限就行 删除桶 点击要删除的桶 点击删除 修改桶 如果哪天需要修改桶的权限或者其他信息&#xff0c;还是先点击这个桶进入详情 然后点击要修改的属性&#xff0c;选择…

活动回顾|阿里云云原生 Serverless 技术实践营 深圳站回放PPT下载

11月24日“阿里云云原生 Serverless 技术实践营”深圳站圆满落幕。活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主&#xff0c;活动形式为演讲、动手实操&#xff0c;让开发者通过一个下午的时间增进对 Serverless 技术的理解&#xff0c;快速上手…

Fuzz进阶教学——人工智能在模糊测试中的应用

【参考文献】白海波.人工智能技术在模糊测试中的应用[J].数字技术与应用,2023,41(08):16-18.DOI:10.19695/j.cnki.cn12-1369.2023.08.05. 目录 摘要 一、模糊测试简介 1、原理 2、工作流程 3、分类 4、应用领域 二、人工智能在模糊测试中的应用 1、人工智能技术 2、人…

内衣洗衣机怎么选?内衣洗衣机便宜好用的牌子推荐

相信不少用户并不太在意衣服和内衣裤裤能不能同时洗&#xff0c;每次清洗都是把内衣裤与其他衣服一起放入洗衣机清洗&#xff0c;其实内衣裤不能直接跟大件的衣物一起放入洗衣机洗的&#xff0c;很容易会造成我们皮肤的瘙痒&#xff0c;我们大部分时间都在户外&#xff0c;暴露…

NineData:帮助开发者用好数据和云

导语 &#xff1a;数据库工具是指用于创建、设计、管理、开发、维护和优化数据库的一系列软件工具&#xff0c;包括数据库设计工具、数据库迁移与复制、数据库管理工具、数据安全工具等&#xff0c;这些工具可以帮助数据库管理员和开发人员更高效地管理、使用和开发数据库&…

嘴尚绝卤味添加草本物质的奥秘,让你品尝健康美味

每当提起卤味&#xff0c;相信很多人的口水都会开始分泌。确实&#xff0c;卤味作为一种深受人们喜爱的美食&#xff0c;其独特的口感和味道总是能够满足人们的味蕾。而在众多卤味品牌中&#xff0c;嘴尚绝卤味因其添加了草本物质而备受关注。那么&#xff0c;嘴尚绝卤味为什么…

Vue框架学习笔记-Object.defineproperty函数

文章目录 前文提要Object.defineProperty作用Object.defineProperty参数使用例图getter&#xff0c;也就是get函数setter&#xff0c;也就是set函数 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 Object.defineProperty作用 当在js中声明了一个变…