diff --git a/a-java-fork-join-framework/README.md b/a-java-fork-join-framework/README.md
index e02f4ed..31d81e8 100644
--- a/a-java-fork-join-framework/README.md
+++ b/a-java-fork-join-framework/README.md
@@ -62,7 +62,7 @@ Result solve(Problem problem) {
尽管这种思想已经存在了很长时间了,但是第一个发布的能系统解决这些问题的框架是`Cilk`[5]。`Cilk`和其他轻量级的框架是基于操作系统的基本的线程和进程机制来支持特殊用途的`Fork/Join`程序。这种策略同样适用于`Java`,尽管`Java`线程是基于低级别的操作系统的能力来实现的。创造这样一个轻量级的执行框架的主要优势是能够让`Fork/Join`程序以一种更直观的方式编写,进而能够在各种支持`JVM`的系统上运行。
-[](http://ifeve.com/fj-design/fj1/)
+
`FJTask`框架是基于`Cilk`设计的一种演变。其他的类似框架有`Hood`[4]、`Filaments`[8]、`Stackthreads`[10]以及一些依赖于轻量级执行任务的相关系统。所有这些框架都采用和操作系统把线程映射到`CPU`上相同的方式来把任务映射到线程上。只是他们会使用`Fork/Join`程序的简单性、常规性以及一致性来执行这种映射。尽管这些框架都能适应不能形式的并行程序,他们优化了`Fork/Join`的设计:
@@ -129,6 +129,8 @@ class Fib extends FJTask {
`Fork/Join`框架的核心在于轻量级调度机制。`FJTask`采用了`Cilk`的`work-stealing`所采用的基本调度策略:
+
+
* 每一个工作线程维护自己的调度队列中的可运行任务。
* 队列以双端队列的形式被维护(注:`deques`通常读作『decks』),不仅支持后进先出 —— `LIFO`的`push`和`pop`操作,还支持先进先出 —— `FIFO`的`take`操作。
* 对于一个给定的工作线程来说,任务所产生的子任务将会被放入到工作者自己的双端队列中。
@@ -137,8 +139,6 @@ class Fib extends FJTask {
* 当一个工作线程触及了`join`操作,如果可能的话它将处理其他任务,直到目标任务被告知已经结束(通过`isDone`方法)。所有的任务都会无阻塞的完成。
* 当一个工作线程无法再从其他线程中获取任务和失败处理的时候,它就会退出(通过`yields`、`sleeps`和/或者优先级调整,参考第3节)并经过一段时间之后再度尝试直到所有的工作线程都被告知他们都处于空闲的状态。在这种情况下,他们都会阻塞直到其他的任务再度被上层调用。
-[](http://ifeve.com/fj-design/fj2/)
-
使用后进先出 —— `LIFO`用来处理每个工作线程的自己任务,但是使用先进先出 —— `FIFO`规则用于获取别的任务,这是一种被广泛使用的进行递归`Fork/Join`设计的一种调优手段。引用[5]讨论了详细讨论了里面的细节。
让偷取任务的线程从队列拥有者相反的方向进行操作会减少线程竞争。同样体现了递归分治算法的大任务优先策略。因此,更早期被偷取的任务有可能会提供一个更大的单元任务,从而使得偷取线程能够在将来进行递归分解。
diff --git a/a-java-fork-join-framework/figure2-0.png b/a-java-fork-join-framework/figure2-0.png
new file mode 100644
index 0000000..587e3b1
Binary files /dev/null and b/a-java-fork-join-framework/figure2-0.png differ
diff --git a/a-java-fork-join-framework/figure2-1.png b/a-java-fork-join-framework/figure2-1.png
new file mode 100644
index 0000000..2885db4
Binary files /dev/null and b/a-java-fork-join-framework/figure2-1.png differ