FutureTask介绍:
FutureTask是一个RunnableFuture<V>,而RunnableFuture实现了Runnable又实现了Future<V>这两个接口;
FutureTask源码分析:
首先分析run方法:
public void run() {
if (this.state == 0 && UNSAFE.compareAndSwapObject(this, runnerOffset, (Object)null, Thread.currentThread())) {
boolean var9 = false;
try {
var9 = true;
Callable var1 = this.callable;
if (var1 != null) {
if (this.state == 0) {
Object var2;
boolean var3;
try {
//操作1
var2 = var1.call();
var3 = true;
} catch (Throwable var10) {
//操作2
var2 = null;
var3 = false;
this.setException(var10);
}
if (var3) {
//操作3
this.set(var2);
var9 = false;
} else {
var9 = false;
}
} else {
var9 = false;
}
} else {
var9 = false;
}
} finally {
if (var9) {
//操作4
this.runner = null;
int var6 = this.state;
if (var6 >= 5) {
this.handlePossibleCancellationInterrupt(var6);
}
}
}
this.runner = null;
int var12 = this.state;
if (var12 >= 5) {
this.handlePossibleCancellationInterrupt(var12);
}
}
}
操作1:调用call方法来执行核心的逻辑,如果调用成功,则将var3置为true, 表示操作已经成功;
操作2:如果执行过程中,出现异常则执行setException方法,将state状态设置成EXCEPTIONAL,唤醒所有在get方法上等待的线程;
操作3:执行成功之后,则执行set方法,将state状态设置成为NORMAL;
分析awaitDone方法:
private int awaitDone(boolean var1, long var2) throws InterruptedException {
long var4 = var1 ? System.nanoTime() + var2 : 0L;
FutureTask.WaitNode var6 = null;
boolean var7 = false;
while(!Thread.interrupted()) {
int var8 = this.state;
if (var8 > 1) {
if (var6 != null) {
var6.thread = null;
}
return var8;
}
if (var8 == 1) {
Thread.yield();
} else if (var6 == null) {
var6 = new FutureTask.WaitNode();
} else if (!var7) {
var7 = UNSAFE.compareAndSwapObject(this, waitersOffset, var6.next = this.waiters, var6);
} else if (var1) {
var2 = var4 - System.nanoTime();
if (var2 <= 0L) {
this.removeWaiter(var6);
return this.state;
}
LockSupport.parkNanos(this, var2);
} else {
LockSupport.park(this);
}
}
this.removeWaiter(var6);
throw new InterruptedException();
}
参考文档:
FutureTask源码解析