`

java callable疑惑:

阅读更多
看了 线程持的源码和Futuretask的源码终于明白了
FutureTask 里面哟个内部类:Sync 这个内部类中包含了
private volatile Thread runner; 这样的一个定义
和      private V result; 的定义 我就明白了
在使用callable的时候最后还是会使用runnable这个接口

  void innerRun() {
            if (!compareAndSetState(READY, RUNNING))
                return;

            runner = Thread.currentThread();//获取当前线程
            if (getState() == RUNNING) { // recheck after setting thread
                V result;
                try {
                    result = callable.call();
                } catch (Throwable ex) {
                    setException(ex);
                    return;
                }
                set(result);// 将得到的值赋值给 private V result; 这个变量
            } else {
                releaseShared(0); // cancel
            }
        }


在看看线程池的原理:
    /**
     * @throws RejectedExecutionException {@inheritDoc}
     * @throws NullPointerException       {@inheritDoc}
     */
    public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }
在 submit 中会实现一个RunnableFuture, 而Futuretask实现了RunnableFuture的接口!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics