Java多线程Callable和Future接口区别

 更新时间:2020年04月15日 11:25:53   作者:edda_huang  
这篇文章主要介绍了Java多线程Callable和Future接口区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Runnable是执行工作的独立任务,但是不返回任何值。如果我们希望任务完成之后有返回值,可以实现Callable接口。在JavaSE5中引入的Callable是一个具有类型参数的范型,他的类型参数方法表示为方法call()而不是run()中返回的值,并且必须使用ExecutorService.submint()方法进行调用。

代码如下

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/*
 * 一、创建执行线程的方式三:实现 Callable 接口。 相较于实现 Runnable 接口的方式,方法可以有返回值,并且可以抛出异常。
 *
 * 二、执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。 FutureTask 是 Future 接口的实现类
 */
public class TestCallable {
 
  public static void main(String[] args) {
    ThreadDemo td =new ThreadDemo();
 
    //1.执行 Callable 方式,需要 FutureTask 实现类的支持,用于接收运算结果。
    FutureTask<Integer> result =new FutureTask<>(td);
 
    new Thread(result).start();
 
    //2.接收线程运算后的结果
    try {
      Integer sum = result.get(); //FutureTask 可用于 闭锁 类似于CountDownLatch的作用,在所有的线程没有执行完成之后这里是不会执行的
      System.out.println(sum);
      System.out.println("------------------------------------");
    }catch (InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }
}
class ThreadDemo implements Callable<Integer> {
  @Override
  public Integer call() throws Exception {
    int sum = 0;
 
    for (int i = 0; i <= 100000; i++) {
      sum += i;
    }
    return sum;
  }
}

 综上例子可以看到: Callable 和 Future接口的区别

(1)Callable规定的方法是call(),而Runnable规定的方法是run().

(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值的。

(3)call()方法可抛出异常,而run()方法是不能抛出异常的。

(4)运行Callable任务可拿到一个Future对象, Future表示异步计算的结果。

它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。

通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。

Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot中使用Quartz管理定时任务的方法

    SpringBoot中使用Quartz管理定时任务的方法

    这篇文章主要介绍了SpringBoot中使用Quartz管理定时任务的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • IDEA启动tomcat项目报错53820 socket closed问题及解决

    IDEA启动tomcat项目报错53820 socket closed问题及解决

    IDEA启动Tomcat项目时报错,原因是IDEA关闭时Tomcat未正常关闭,导致端口被占用,解决方法是通过任务管理器关闭占用高内存的Java进程,通常是IDEA进程下面的,或者使用命令行找到PID并强制终止进程
    2024-12-12
  • Java中println输出汉字乱码问题一招解决方案

    Java中println输出汉字乱码问题一招解决方案

    这篇文章主要介绍了Java中println输出汉字乱码问题一招解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Spring Boot Yaml配置高级用法

    Spring Boot Yaml配置高级用法

    这篇文章主要介绍了Spring Boot Yaml配置高级用法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Java经典面试题最全汇总208道(五)

    Java经典面试题最全汇总208道(五)

    这篇文章主要介绍了Java经典面试题最全汇总208道(五),本文章内容详细,该模块分为了六个部分,本次为第五部分,需要的朋友可以参考下
    2023-01-01
  • SpringBoot集成RabbitMQ实现用户注册的示例代码

    SpringBoot集成RabbitMQ实现用户注册的示例代码

    这篇文章主要介绍了SpringBoot集成RabbitMQ实现用户注册的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Java线程中Thread方法下的Join方法详解

    Java线程中Thread方法下的Join方法详解

    这篇文章主要介绍了Java线程中Thread方法下的Join方法详解,在项目中往往会遇到这样一个场景,就是需要等待几件事情都给做完后才能走下面的事情,这个时候就需要用到Thread方法下的Join方法,join方法是无参且没有返回值的,需要的朋友可以参考下
    2024-01-01
  • Java 5个人坐在一起(有关第五个人岁数的问题)

    Java 5个人坐在一起(有关第五个人岁数的问题)

    利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推,需要的朋友可以参考下
    2017-02-02
  • sentinel流量控制框架(目录设置)

    sentinel流量控制框架(目录设置)

    Sentinel 是面向分布式服务架构的高可用流量防护组件帮助开发者保障微服务的稳定性,本文重点给大家介绍sentinel流量控制框架的相关知识,感兴趣的朋友一起看看吧
    2022-03-03
  • Java 面向对象通过new揭开对象实例化

    Java 面向对象通过new揭开对象实例化

    各位铁汁们大家好呀,我们上次博客讲了,通过 Student student1 = new Student();就可以实例化一个对象,这个对象就有Student类中的所以成员变量。可是 对象student1 和 类Student到底是怎样建立联系的,在内存中到底发生了什么
    2022-04-04

最新评论