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小总结
笔者技术一般,有问题请指出修正