FutureTask源码阅读与理解
2018-01-18 23:33
411 查看
FutureTask源码阅读与理解
简述:FutureTask实现了Runnable和Future接口,代表此类可以被线程池调度和异步执行任务。
几个变量:
几个方法:
简述:FutureTask实现了Runnable和Future接口,代表此类可以被线程池调度和异步执行任务。
几个变量:
//以下是state的几种状态 private volatile int state; private static final int NEW = 0; private static final int COMPLETING = 1; private static final int NORMAL = 2; private static final int EXCEPTIONAL = 3; private static final int CANCELLED = 4; private static final int INTERRUPTING = 5; private static final int INTERRUPTED = 6; //具体任务 private Callable<V> callable; //任务执行完毕结果存放属性 private Object outcome; //记录执行任务的线程 private volatile Thread runner; //链表结构,表示等待结果的线程 private volatile WaitNode waiters;
几个方法:
//run方法就是执行任务的方法 public void run() { //判断state并试着去更新线程变量 if (state != NEW || !UNSAFE.compareAndSwapObject(this, runnerOffset, null, Thread.currentThread())) return; try { Callable<V> c = callable; if (c != null && state == NEW) { //返回数据 V result; //是否执行成功标识 boolean ran; try { //执行方法 result = c.call(); ran = true; } catch (Throwable ex) { result = null; ran = false; setException(ex); } //如果执行成功则执行set方法 if (ran) set(result); } } finally { runner = null; int s = state; //判断state如果被中断则让出资源并等待被杀死 if (s >= INTERRUPTING) handlePossibleCancellationInterrupt(s); } } protected void set(V v) { //更新state状态为完成 if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) { //结果赋值给outcome outcome = v; //最终状态 UNSAFE.putOrderedInt(this, stateOffset, NORMAL); //唤醒一些等待结果的线程 finishCompletion(); } } private void finishCompletion() { for (WaitNode q; (q = waiters) != null;) { //将等待者置空 if (UNSAFE.compareAndSwapObject(this, waitersOffset, q, null)) { //遍历所有等待者 for (;;) { Thread t = q.thread; if (t != null) { q.thread = null; //唤醒线程 LockSupport.unpark(t); } WaitNode next = q.next; if (next == null) break; q.next = null; // unlink to help gc q = next; } break; } } //完成任务并唤醒所有等待结果线程再执行done方法 done(); callable = null; // to reduce footprint } //获取数据的方法,可限时: public V get() throws InterruptedException, ExecutionException { int s = state; if (s <= COMPLETING) s = awaitDone(false, 0L); return report(s); } public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { if (unit == null) throw new NullPointerException(); int s = state; if (s <= COMPLETING && (s = awaitDone(true, unit.toNanos(timeout))) <= COMPLETING) throw new TimeoutException(); return report(s); } //具体的取值-等待方法 private int awaitDone(boolean timed, long nanos) throws InterruptedException { //可限时挂起 final long deadline = timed ? System.nanoTime() + nanos : 0L; WaitNode q = null; boolean queued = false; for (;;) { //如果线程被中断,则删除等待 if (Thread.interrupted()) { removeWaiter(q); throw new InterruptedException(); } //如果大于已完成则返回 int s = state; if (s > COMPLETING) { if (q != null) q.thread = null; return s; } //说明执行任务的线程正在给outcome赋值,让掉cpu else if (s == COMPLETING) // cannot time out yet Thread.yield(); //如果q==null那就创建一个等待节点 else if (q == null) q = new WaitNode(); //试着加入队列 else if (!queued) queued = UNSAFE.compareAndSwapObject(this, waitersOffset,q.next = waiters, q); //是否有设置超时时间 else if (timed) { nanos = deadline - System.nanoTime(); if (nanos <= 0L) { removeWaiter(q); return state; } LockSupport.parkNanos(this, nanos); } //挂起线程 else LockSupport.park(this); } }
相关文章推荐
- Java源码阅读之FutureTask
- 简便使用jQuery-源码阅读全局架构设计的理解
- Android源码阅读与理解(二):Android系统Build流程详解
- 21 BasicTaskScheduler基本任务调度器(一)——Live555源码阅读(一)任务调度相关类
- 转知乎:如何阅读源代码-- 源码理解不是读出来的,是用来debug出来的.
- [Chrome源码阅读] 理解Thread类实现
- java里面的FutureTask简单使用(配合源码讲解)
- JDK源码(FutureTask)——java.util.concurrent(十)
- Universal-Image-Loader源码阅读(36)-DisplayBitmapTask
- [SDS阅读理解/8]源码中的函数/5
- HashMap源码阅读与理解
- FutureTask 理解
- 【原】storm源码之理解Storm中Worker、Executor、Task关系
- kubernetes源码之watch包filter.go阅读理解三
- Java FutureTask 源码解析
- [Chrome源码阅读] 理解ObserverList类的实现技巧
- Deep Compression阅读理解及Caffe源码修改
- Spark修炼之道(高级篇)——Spark源码阅读:第九节 Task执行成功时的结果处理
- java FutureTask 源码解析
- JDK部分源码阅读与理解