Callable、Future和FutrueTask详解

news2024/11/26 2:28:25

一、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{


    @Override
    public 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.coloradmin.cn/o/1257766.html

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

相关文章

手机爬虫用Fiddler详细教程

如果你正在进行手机爬虫的工作&#xff0c;那么一款强大而又实用的网络调试工具Fiddler将会是你的好帮手。今天&#xff0c;我将和大家分享一份详细的Fiddler教程&#xff0c;教你如何使用它来轻松捕获和分析手机App的网络请求。让我们一起来探索Fiddler的功能和操作&#xff0…

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

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

2023年11月27日历史上的今天大事件早读

1852年11月27日 计算机程序创始人阿达-洛芙莱斯去世 1893年11月27日 抗日爱国将领续范亭诞辰 1895年11月27日 《茶花女》作者、法国著名作家小仲马逝世 1899年11月27日 董其武将军诞辰 1902年11月27日 《新小说》创刊 1907年11月27日 割让刚果给比利时的条约签订 1925年1…

AMD ROCm软件栈组件介绍

AMD ROCm™ Platform 1.1 ROCm简介 参考&#xff1a;https://github.com/RadeonOpenCompute/ROCm ROCm&#xff08;Radeon Open Compute&#xff09;开源软件栈。 在NVIDIA GPU上&#xff0c;术语“CUDA”通常是指GPU编程编译器、API和运行时库&#xff0c;但ROCm不那么单一…

C语言基础篇5:指针(一)

指针是C语言的核心、精髓所在&#xff0c;用好了指针可以在C语言编程中起到事半功倍的效果。指针一方面可以提高程序的编译效率和执行速度&#xff0c;而且还可以通过指针实现动态的存储分配&#xff0c;另一方面使用指针可使程序更灵活&#xff0c;便于表示各种数据结构&#…

数据结构与算法编程题26

计算二叉树深度 #define _CRT_SECURE_NO_WARNINGS#include <iostream> using namespace std;typedef char ElemType; #define ERROR 0 #define OK 1 #define Maxsize 100 #define STR_SIZE 1024typedef struct BiTNode {ElemType data;BiTNode* lchild, * rchild; }BiTNo…

Python基础:字符串(String)详解(需补充完善)

1. 字符串定义 在Python中&#xff0c;字符串是一种数据类型&#xff0c;用于表示文本数据。字符串是由字符组成的序列&#xff0c;可以包含字母、数字、符号和空格等字符。在Python中&#xff0c;你可以使用单引号&#xff08;&#xff09;或双引号&#xff08;"&#xf…

在 Banana Pi BPI-R2 PRO RK3568开源路由器上安装 OpenWrt 23 快照固件

这是在 BPI-R2 Pro&#xff08;到内部 eMMC&#xff09;上安装 OpenWrt 23 快照固件的快速指南。该固件已预装 LuCI 和一些软件包。这是 2023 年 9 月 2 日的屏幕截图。 LuCI 主页概述。Linux内核是6.1.50 网络接口概述。PPPoE 连接已启动并正在运行 速度测试和 CPU 使用情况…

谈谈中间件设计的思路

前言 想要设计和真正理解中间件的架构理论和思想。对于开发来说需要具备三个关键的能力 1&#xff1a;基础通用技术的深入理解和运用2&#xff1a;了解和熟悉常见中间件的设计思想&#xff0c;且有自己的感悟,并且能按照自己的理解模仿写一写3&#xff1a;业务的高度理解能力…

赞比亚市场开发攻略,带你走进非洲“铜矿王国”

赞比亚是非洲最早跟中国建交的国家&#xff0c;跟我们经贸联系一直也比较紧密。赞比亚很多生产生活资料比较依赖进口&#xff0c;市场潜力还是不错的。今天就来给大家分享一下非洲这个铜矿王国的开发攻略。文章略长&#xff0c;大家点赞收藏关注慢慢看。 文章目录&#xff1a;…

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

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

BEV+Transformer架构加速“上车”,智能驾驶市场变革开启

BEVTransformer成为了高阶智能驾驶领域最为火热的技术趋势。 近日&#xff0c;在2023年广州车展期间&#xff0c;不少车企及智能驾驶厂商都发布了BEVTransformer方案。其中&#xff0c;极越01已经实现了“BEVTransformer”的“纯视觉”方案的量产&#xff0c;成为国内唯一量产…

当OLAP碰撞Serverless,看ByteHouse如何建设下一代云计算架构

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 作为云计算的下一个迭代&#xff0c;Serverless 可以使开发者更专注于构建产品中的应用&#xff0c;而无需考虑底层堆栈问题。伴随着近年来相关技术成熟度的增加&am…

Node——npm包管理器的使用

Node.js使用npm对包进行管理&#xff0c;其全称为Node Package Manager&#xff0c;开发人员可以使用它安装、更新或者卸载Node.js的模块 1、npm包管理器基础 1.1、npm概述 npm是Node.js的标准软件包管理器&#xff0c;其在2020年3月17日被GitHub收购&#xff0c;而且保证永…

Python3基础

导包 在 python 用 import 或者 from...import 来导入相应的模块。 将整个模块(somemodule)导入&#xff0c;格式为&#xff1a; import somemodule 从某个模块中导入某个函数,格式为&#xff1a; from somemodule import somefunction 从某个模块中导入多个函数,格式为&#…

【Linus】进程的等待

进程等待的必要性 如果子进程退出了&#xff0c;父进程没有对子进程进行回收&#xff0c;子进程就会进入僵尸进程&#xff0c;占用内存&#xff0c;导致内存泄漏如果程序进入僵尸状态&#xff0c;那么kill -9 也无法强制杀死进程子进程是父进程创建出来&#xff0c;完成父进程…

介绍比特币上的 sCrypt 开发平台

最强大的基础设施和工具套件&#xff0c;可轻松构建和扩展您的 dApp 杀手级应用在哪里&#xff1f; 尽管比特币在小额支付、国际汇款和供应链管理等广泛用例中具有颠覆性潜力&#xff0c;但在推出 14 年后&#xff0c;我们还没有看到一款非常受欢迎并被主流采用的杀手级应用。 …

Star History 十月开源精选 |AI for Postgres

在 2023 年 Stack Overflow 开发者调查中&#xff0c;Postgres 顶替了 MySQL 被评为最受欢迎的数据库。一个重要因素应该是 Postgres 支持扩展&#xff1a;可扩展的架构 Postgres 仍然由社区拥有&#xff0c;Postgres 生态近年来蓬勃发展。 扩展可以看作是内置功能&#xff0c…

基于SpringBoot的超市信息管理系

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着我国经济的不断发…