java高并发_异步_callable

java高并发_异步_callable

Callable族群

Future实际使用了代理模式的思想(网上还有说future模式,可自行百度)

实现异步的三个重要类/接口

Callable接口:一个有返回值的call()。 —返回值可说是为了实现异步准备的

Future接口: 通过Future类操纵实现Callable的任务线程 —使用了代理模式,Future需要实现get方法,来获取异步执行的结果

程序员要自己写实现Callable的线程类 —被代理对象

具体实现

请添加图片描述

RunnableFuture接口:实现了Runnable和Future接口,实现Runnable接口是为了实现线程的基本功能,实现Future接口就是让此类成为代理类

FutureTask(重点point)
属性定义:

阅读FutureTask底层源码可发现被代理类最终输出结果的属性定义

当然还有状态属性state用于表示线程的当前状态
请添加图片描述
还有一个类似lock的runner请添加图片描述
在运行task的run方法时候使用Unsafe进行CAS操纵runner上乐观锁
对于执行完的run方法,最终都将runner设置为null请添加图片描述

方法:

请添加图片描述

FutureTask有两个构造方法,都要定义好被代理类

public FutureTask(Callable<V> callable) {
    if (callable == null)
        throw new NullPointerException();
    this.callable = callable;
    this.state = NEW;       // ensure visibility of callable
}
//参数一,没有返回值的Runnable,参数二,充当返回的result,Executors.callable()使用适配器模式将Runnable封装成Callable
 public FutureTask(Runnable runnable, V result) {
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }

代理模式下认为比较核心的方法

cancel() —取消任务,试图中断task的run(),修改task的各个状态成取消状态

get() —获取task得到的callable运行结果

set() —将callable运行结果放入task的outcome结果

run() —CAS判断是否可运行,运行callable实现类的call()方法,获取结果,set()到属性outcome完成代理动作

比较辅助性质的方法

report() —返回任务结果或者异常报错(根据task的状态state返回相应结果)

handlePossibleCancellationInterrupt() —寻找合适的时机中断任务(即为cancel方法服务)

finishCompletion() —善后处理,等待线程置null,callable承载体置空等

awaitDone() —试图将还没完成的线程的状态设置成完成或者超时中止等相应的状态

removeWaiter() —用于断开一些超时或者中断的等待节点

runAndReset() —用于重复执行run()

isCancelled() —查看线程task是否被取消(return state >= CANCELLED;)

isDone() —查看线程task是否被执行,不管是否成功或终止(return state != NEW;)

done() —善后动作,空实现,可以做类似打日志之类的行为

FutureTask小总结

在这里插入图片描述
笔者技术一般,有问题请指出修正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值