和阿里面试官对线FutureTask源码面试(中)

简介: 和阿里面试官对线FutureTask源码面试(中)

4.1.5 timed get - 超时获取

  • 必要时最多等待给定时间以完成任务,然后获取其结果(若有)
  • image.png
  • 抛CancellationException 如果任务被取消

抛 ExecutionException 如果任务抛了异常

抛InterruptedException 如果当前线程在等待时被中断

抛TimeoutException 如果等待超时了

两个get()方法都是阻塞的,若被调用时,任务还没有执行完,则调用get()方法的线程会阻塞,直到任务执行完才会被唤醒。所以future.get()会阻塞当前调用线程。


阻塞异步线程

image.png

image.png

阻塞主线程

image.png

image.png

5 RunnableFuture

Java6 时提供的持有 Runnable 性质的 Future。

成功执行run方法导致Future的完成,并允许访问其结果。

RunnableFuture接口比较简单,就是继承了 Runnable 和 Future 接口。只提供一个run方法

image.png

创建任务有两种方式

  • 无返回值的 Runnable
  • 有返回值的 Callable

但这样的设计,对于其他 API 来说并不方便,没法统一接口。

所以铺垫了这么多,主角 FutureTask 来了!

6 FutureTask

image.png

Future是个接口,FutureTask 才是个实实在在的工具类,是线程运行的具体任务。

实现了 RunnableFuture 接口,即实现了 Runnnable 接口,即FutureTask 本身就是个 Runnnable。也表明了 FutureTask 实现了 Future,具备对任务进行管理的功能。

6.1 属性

6.1.1 运行状态

最初为NEW。 运行状态仅在set,setException和cancel方法中转换为最终状态。

在完成期间,状态可能会呈现COMPLETING(正在设置结果时)或INTERRUPTING(仅在中断运行任务去满足cancel(true)时)的瞬态值。

从这些中间状态到最终状态的转换使用更加低价的有序/惰性写入,因为值是唯一的,无法进一步修改。


常量字段定义:

image.png

  • NEW
    线程任务创建,开始状态
  • COMPLETING
    任务执行中,正在运行状态
  • NORMAL
    任务执行结束
  • EXCEPTIONAL
    任务异常
  • CANCELLED
    任务取消成功
  • INTERRUPTING
    任务正在被打断中
  • INTERRUPTED = 6
    任务被打断成功

可能的状态转换

  • NEW -> COMPLETING -> NORMAL
  • NEW -> COMPLETING -> EXCEPTIONAL
  • NEW -> CANCELLED
  • NEW -> INTERRUPTING -> INTERRUPTED

6.1.2 其他属性

  • 组合的 callable,这样就具备了转化 Callable 和 Runnable 的功能
  • image.png
  • 从ge()返回或抛异常的结果,非volatile,受state的读/写保护
  • image.png
  • 运行 callable 的线程; 在run()期间进行CAS
  • image.png
  • 记录调用 get 方法时被等待的线程 - 栈形式
  • image.png
  • Callable 是作为 FutureTask 的属性之一,接着我们看下 FutureTask 的构造器,看看两者是如何转化的。
目录
相关文章
|
4月前
|
监控 Java 数据安全/隐私保护
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
|
3月前
|
负载均衡 架构师 Cloud Native
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选  CP 还是 AP?为什么?
|
4月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
106 2
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
11月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
11月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
11月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
258 4
|
12月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
1109 2