    the type of the result
     *
     * @return a callable object
     *
     * @throws NullPointerException if task null
     */
    // 包装Runnable任务，有返回值
    public static <T> Callable<T> callable(Runnable task, T result) {
        if(task == null) {
            throw new NullPointerException();
        }
        return new RunnableAdapter<T>(task, result);
    }
    
    /**
     * Returns a {@link Callable} object that will, when called,
     * execute the given {@code callable} under the current access
     * control context. This method should normally be invoked within
     * an {@link AccessController#doPrivileged AccessController.doPrivileged}
     * action to create callables that will, if possible, execute
     * under the selected permission settings holding within that
     * action; or if not possible, throw an associated {@link
     * AccessControlException}.
     *
     * @param callable the underlying task
     * @param <T>      the type of the callable's result
     *
     * @return a callable object
     *
     * @throws NullPointerException if callable null
     */
    // 包装Callable任务，使用上下文访问权限控制器
    public static <T> Callable<T> privilegedCallable(Callable<T> callable) {
        if(callable == null) {
            throw new NullPointerException();
        }
        return new PrivilegedCallable<T>(callable);
    }
    
    /**
     * Returns a {@link Callable} object that will, when called,
     * execute the given {@code callable} under the current access
     * control context, with the current context class loader as the
     * context class loader. This method should normally be invoked
     * within an
     * {@link AccessController#doPrivileged AccessController.doPrivileged}
     * action to create callables that will, if possible, execute
     * under the selected permission settings holding within that
     * action; or if not possible, throw an associated {@link
     * AccessControlException}.
     *
     * @param callable the under