Callable接口

news/2025/1/11 23:51:29/

目录

一、Callable接口的含义

二、Callable接口的使用

       步骤一:明确执行任务的内容及其返回值

       步骤二:把任务交给线程来执行

      步骤三:获取任务的返回值


一、Callable接口的含义

   Callable接口和runnable接口类似,本质上描述的也是任务。

   但是,Callable接口相比于Runnable接口,新增了两个功能:

   ①让执行的任务拥有了返回值,返回值的类型为Callable接口当中的泛型

        比如执行一个++操作,让某个变量的值自增。这个时候,如果使用runnable接口来执行这个任务,那么一定要在run()方法外部新建一个变量收集自增之后的值。

        但是,如果使用了Callable接口,让自增过后的值直接返回,这样就更加地方便。

Callable<Integer> callable= new Callable<Integer>() {//类似于runnable的run方法//返回值是泛型参数@Overridepublic Integer call() throws Exception {int i;for( i=0;i<1000;i++){i++;}return i;}};

    ②让执行过程中出现的异常可以及时被声明

            

       回顾一下throws关键字的含义:

       这个关键字的含义就是声明方法内部可能发生的异常。

       当运行时候,如果发生了异常,没有进行及时的处理,那么这个异常就会抛出给它的调用者处理。

       那么,在这个程序当中。如果发生了异常,会交给谁处理呢?

 ①方法内部如果及时处理了异常,那么按照方法内部处理异常的逻辑来进行处理;

 ②如果方法内部没有及时处理异常,那么会抛给调用get()方法获取返回值的线程来处理

   

③如果没有get()方法获取,那么这个异常就会交给jvm来处理,那么也就意味着这个线程会被提前终止。 


二、Callable接口的使用

       步骤一:明确执行任务的内容及其返回值

         代码上面的实现,主要是依托指定Callable接口指定的泛型以及重写接口当中的run()方法。

          


       步骤二:把任务交给线程来执行

         创建一个FutureTask对象,泛型为构造方法当中callable接口任务的泛型。

         创建一个线程对象t,把FutureTask的实例作为参数传递给线程对象t。

         启动线程


      步骤三:获取任务的返回值

         是通过task.get()方法获取任务的返回值的。

         需要注意的是,如果执行任务的线程没有执行完毕,那么,获取返回值的线程,也就是调用task.get()方法的线程,需要阻塞等待

         此时main线程为调用get()方法的线程,那么也就意味着main线程需要阻塞等待,直到任务执行完毕,获取到返回值。


       整体代码实现:

public class ThreadDemo29 {public static void main(String[] args) {Callable<Integer> callable= new Callable<Integer>() {//类似于runnable的run方法//返回值是泛型参数@Overridepublic Integer call() throws Exception {int i;for( i=0;i<100;i++){i++;}return i;}};//不可以直接传入callable接口//Thread t=new Thread(callable);//未来的任务FutureTask<Integer> task=new FutureTask<>(callable);Thread t=new Thread(task);//启动线程t.start();try {Integer result=task.get();System.out.println(result);} catch (InterruptedException|ExecutionException|ArithmeticException e) {e.printStackTrace();}}
}


http://www.ppmy.cn/news/10452.html

相关文章

061-java中URL和HttpURLConnection使用方法详细介绍

【上一讲】060-MySQL数据库综合应用(实现登录及注册功能源代码)_CSDN专家-赖老师(软件之家)的博客-CSDN博客 【下一讲】062-TCP网络通讯ServerSocket及Socket类使用详解_CSDN专家-赖老师(软件之家)的博客-CSDN博客 在java.net包中定义了URL类,URL类封装了使用统一资源定…

WordPress 的“more”标签

隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观看!隐藏内容,订阅专栏可观…

第46章 Python urllib教程

Python urllib教程 库用于操作网页 URL,并对网页的内容进行抓取处理。 本文主要介绍 Python3 的 urllib。 urllib 包 包含以下几个模块: urllib.request - 打开和读取 URL。urllib.error - 包含 urllib.request 抛出的异常。urllib.parse - 解析 URL。urllib.robotparser -…

十大字符串函数与内存操作函数

前言&#xff1a;我们知道在C语言的库中有许许多多的库函数&#xff0c;今天我就来介绍一下自己对两大类库函数中一些常用函数的认识和理解&#xff0c;希望对大家有帮助。 说明&#xff1a;下文中会花较大篇幅实现这些库函数的模拟&#xff0c;请大家不要觉得库函数直接用就好…

Jackson_annotations注解使用

1、JsonIdentityInfo 英文说明: 1、JsonIdentityInfo is used when objects have parent child relationship. JsonIdentityInfo is used to indicate that object identity will be used during serialization/de-serialization. 2、中文翻译&#xff1a;JsonIdentityInfo 在对…

计算机网络复习之网络层

文章目录数据报与虚电路服务的对比IP 协议IP数据报格式IP地址NAT&#xff08;网络地址转换&#xff09;子网划分和子网掩码在支持子网划分的因特网中&#xff0c;路由器如何转发IP数据报无分类编制CIDR构成超网RIP协议OSPF协议ARP协议ICMP协议Ping和Traceroute参考路由选择是网…

C库函数:time.h

time.h C 标准库 – <time.h> | 菜鸟教程 (runoob.com) 库变量 下面是头文件 time.h 中定义的变量类型&#xff1a; 序号变量 & 描述1size_t 是无符号整数类型&#xff0c;它是 sizeof 关键字的结果。2clock_t 这是一个适合存储处理器时间的类型。3time_t is 这是一…

Flow 转 LiveData 后数据丢了,肿么回事?

翻译自&#xff1a; https://arkadiuszchmura.com/posts/be-careful-when-converting-flow-to-livedata/ 前言 最近我在负责一段代码库&#xff0c;需要在使用 Flow 的 Data 层和仍然依赖 LiveData 暴露 State 数据的 UI 层之间实现桥接。好在 androidx.lifecycle 框架已经提供…