看了 线程持的源码和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的接口!
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的接口!