上一次分析了forkjoinpool構造時做了哪些工作,現在看一下這個框架的task是怎麼玩的。task有乙個頂層設計的介面就是forkjointask,有兩個類繼承了這個介面,分別是recursivetask,recursiveaction。區別就是乙個任務有返回值乙個任務沒有返回值。看看兩個task的定義:
public abstract
class
recursivetask
extends
forkjointask
protected
final void setrawresult(v value)
/*** implements execution conventions for recursivetask.
*/protected
final boolean exec()
}
從這裡看到recursivetask 是帶返回值的。並且繼承recursivetask 類時需要實現compute方法。
public abstract
class
recursiveaction
extends
forkjointask .*
* @return always
*/public final void getrawresult()
/*** requires null completion value.
*/protected
final void setrawresult(void mustbenull)
/*** implements execution conventions for recursiveactions.
*/protected
final boolean exec()
}
recursiveaction 這個類不能帶返回值,因為在getrawresult方法中直接返回了null。同樣,繼承這個類實現的task也要實現compute方法才行。
這裡用了乙個模板方法的設計模式,這個設計模式的作用是定義好乙個演算法骨架,在不改變演算法結構的情況下,將演算法中特定的步驟實現推遲到子類中來處理。這裡compute方法是個抽象方法,用於子類實現,但是exec方法確定final的,子類不能overwrite,框架可以呼叫exec方法來使得整個演算法保持完整。
最後看看這個頂層設計forkjointask。這個類也許有三點需要重點關注。
第一:在我們**邏輯中呼叫的invokeall(forkjointask
public
final forkjointaskfork()
這個方法呼叫到了forkjoinworkthread中的pushtask方法,forkjoinworkerthread物件其實已經初始化了….在pool 初始化的時候,繼續看。
final
void pushtask(forkjointask<?> t)
}
這裡其實又呼叫到pool的signalwork()方法了。
這個方法很複雜,後續分析。
第三點看一下unsafe類的用法。這個類我們使用不了。主要是jdk來使用。這裡有個文章可以參考,
原始碼分析之LayoutInflater
簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...
原始碼分析之HashMap
首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...
原始碼分析之String
先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...