future task cancel

发布时间 2023-09-04 20:37:45作者: silyvin
    //有一个入参,需要说明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;
    }

 

跑完了 饭回false

没跑完,输入true,修改为Interrupting,修改为Interrupted,返回true

没跑完,输入false,修改为Cancelled,返回true

 

compareAndSwapInt 相等并赋值成功返回true,否则返回false