Java并发教程之Callable和Future接口详解

 更新时间:2021年07月28日 09:11:14   作者:MoonsCode  
Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理,这篇文章主要给大家介绍了关于Java并发教程之Callable和Future接口的相关资料,需要的朋友可以参考下

刚把Thread 的知识理了一遍。

Runnable是一个接口,而Thread是Runnable的一个实现类。

所以也就有了之前创建线程的两种方法

  • 继承Thread
  • 实现Runnable

我们看一下新建线程的方法:

都是得传入一个Runnable对象(这句话很关键)

所以传入一个Runnble和Thread对象都行。

现在引入创建线程的第三种方法:Callable

为了实现 Runnable,需要实现不返回任何内容的 run()方法,而对于

Callable,需要实现在完成时返回结果的 call()方法。

• call()方法可以引发异常,而 run()则不能。

Callable最大的特点就是 它能返回数值,并抛出异常,而且它不是run()方法,而是call()方法。

但是Callable最大的问题就是不能丢人Thread类中直接创建,因为Thread只认识Runnable,所以我们必须找到Callable和Runnable之间的桥梁。

也就是找一个类,即和Runnable友关系,又和Callable有关系。

这个类就是FutureTask了。

  • Runnable接口有实现类FutureTask
  • FutureTask构造可以传递Callable

所以创建也给Callable可以这样

新类 MyThread2 实现 callable 接口
class MyThread2 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return 200;
}

1、新建一个callable对象

Callable callable = new MyThread2()

2、传入callable对象,并新建一个futuretask对象,

FutureTask futureTask2 = new FutureTask(callable)

也可以之间通过lam表达式(函数式接口)实现

3、新建一个线程,传入FutureTask对象

new Thread(futureTask2, “线程二”).start()

这就是基本步骤。

接下来可以来扩展地讲讲 futuretask的作用

Future对象

Future 接口

当 call()方法完成时,结果必须存储在主线程已知的对象中,以便主线程可以知道该线程返回的结果。为此,可以使用 Future 对象。

将 Future 视为保存结果的对象–它可能暂时不保存结果,但将来会保存(一旦Callable 返回)。Future 基本上是主线程可以跟踪进度以及其他线程的结果的一种方式。要实现此接口,必须重写 5 种方法,这里列出了重要的方法,如下:

• public boolean cancel(boolean mayInterrupt):用于停止任务。

如果尚未启动,它将停止任务。如果已启动,则仅在 mayInterrupt 为 true时才会中断任务。

• public Object get()抛出 InterruptedException,ExecutionException:

用于获取任务的结果。

如果任务完成,它将立即返回结果,否则将等待任务完成,然后返回结果。

• public boolean isDone():如果任务完成,则返回 true,否则返回 false可以看到 Callable 和 Future 做两件事-Callable 与 Runnable 类似,因为它封装了要在另一个线程上运行的任务,而 Future 用于存储从另一个线程获得的结
果。实际上,future 也可以与 Runnable 一起使用。

要创建线程,需要 Runnable。为了获得结果,需要 future。

FutureTask

Java 库具有具体的 FutureTask 类型,该类型实现 Runnable 和 Future,并方便地将两种功能组合在一起。 可以通过为其构造函数提供 Callable 来创建FutureTask。然后,将 FutureTask 对象提供给 Thread 的构造函数以创建Thread 对象。因此,间接地使用 Callable 创建线程。

核心原理:(重点)

在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给 Future 对象在后台完成

• 当主线程将来需要时,就可以通过 Future 对象获得后台作业的计算结果或者执行状态

• 一般 FutureTask 多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。

• 仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法

• 一旦计算完成,就不能再重新开始或取消计算

• get 方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常

• get 只计算一次,因此 get 方法放到最后

举个例子吧。

比如现在老师在上课,但是他渴了,他想买水,但是还得继续上课。

这时就可以单独开启一条线程,让班长去帮他买水。(开启单独一条线程,不影响主线程的运行)

get方法可以得到return的值

isDone()方法可以判断是否完成了。


第一次会计算,第二次(之前计算过的),就直接返回结果了。

总结

到此这篇关于Java并发教程之Callable和Future接口的文章就介绍到这了,更多相关Java并发Callable和Future接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RepeatSubmit若依框架如何防止表单重复提交注解

    RepeatSubmit若依框架如何防止表单重复提交注解

    若依框架中的@RepeatSubmit注解用于防止表单重复提交,通过在控制器方法上添加该注解,并在前端页面和JavaScript代码中实现双重校验,可以确保同一用户在短时间内不会重复提交相同的表单
    2024-11-11
  • MybatisPlus中saveBatch方法的使用

    MybatisPlus中saveBatch方法的使用

    本文介绍了MyBatisPlus中的saveBatch方法的使用及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • java递归算法实例分析

    java递归算法实例分析

    这篇文章主要介绍了java递归算法实例分析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringBoot实现异步事件驱动的方法

    SpringBoot实现异步事件驱动的方法

    本文主要介绍了SpringBoot实现异步事件驱动的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • java abstract class interface之间的区别介绍

    java abstract class interface之间的区别介绍

    含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象,abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法
    2012-11-11
  • 深入学习java内存化和函数式协同

    深入学习java内存化和函数式协同

    这篇文章主要介绍了深入学习java内存化和函数式协同,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • 如何解决Nacos服务下线报错问题

    如何解决Nacos服务下线报错问题

    这篇文章主要介绍了如何解决Nacos服务下线报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 详解MyBatis的Dao层实现和配置文件深入

    详解MyBatis的Dao层实现和配置文件深入

    这篇文章主要为大家详细介绍了MyBatis的Dao层实现和配置文件深入,文中的示例代码讲解详细,感兴趣的小伙伴快来跟随小编一起学习一下
    2022-07-07
  • 浅析Disruptor高性能线程消息传递并发框架

    浅析Disruptor高性能线程消息传递并发框架

    这篇文章主要为大家介绍了Disruptor高性能线程消息传递并发框架的简单分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • MyBatis入门介绍(超简单)

    MyBatis入门介绍(超简单)

    mybatis是Java的持久层框架, JAVA操作数据库是通过jdbc来操作的,而mybatis是对jdbc的封装。下文给大家介绍mybatis入门知识,感兴趣的朋友参考下吧
    2017-08-08

最新评论