FutureTask的cancel()方法分析

面试时被问到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版权协议,转载请附上原文出处链接和本声明。