ForkJoin原始碼分析之Task

2021-07-10 23:53:32 字數 1629 閱讀 3066

上一次分析了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...