FutureTask 源码分析

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源码解析

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值