面试时被问到futurtask的取消原理,没回答上来,回来阅读以下源码做个记录。
//有一个入参,需要说明task是否是可中断的
public boolean cancel(boolean mayInterruptIfRunning) {
if (state != NEW)
return false;
if (mayInterruptIfRunning) {
//尝试修改futuretask的运行状态
if (!UNSAFE.compareAndSwapInt(this, stateOffset, NEW, INTERRUPTING))
return false;
//获取当前线程发出中断信号
Thread t = runner;
if (t != null)
t.interrupt();
//修改task装态为已中断的
UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED); // final state
}
//如果是不可中断的只修改task的状态为cancelled
else if (!UNSAFE.compareAndSwapInt(this, stateOffset, NEW, CANCELLED))
return false;
//执行finishCompletion方法
/**
* Removes and signals all waiting threads, invokes done(),and nulls out callable.
*/
finishCompletion();
return true;
}版权声明:本文为m0_37556444原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。