デザインパターン入門【マルチスレッド編】備忘録

android開発を少しすることになってマルチスレッド周りの知識が残念な感じだったので、良い本だと噂の

https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88-Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E7%B7%A8-%E7%B5%90%E5%9F%8E-%E6%B5%A9-ebook/dp/B00I8AT1BS

を読んだので備忘録。

メモ

  • synchronizedがあったら何か守るべきものがあると考える
  • InterruptedException
    • throws InterruptedExceptionがついているメソッドは以下のように認識すると良い
      • 時間がかかる
      • キャンセルできる
    • Thread.interruptメソッドは直接InterruptedExceptionを投げるわけではなく、Threadをinterrupt状態にするだけ
    • Threadがwait,sleep,joinなどの待ち状態のときにinterrupt状態を確認していて、interrupt状態の場合にInterruptedExceptionを自ら投げる
    • 通常の処理を行っているときに急にInterruptedExceptionが発生することはない

パターン図

いくつかパターンをピックアップして、PlauntUMLの練習がてら図で表してみる。

guard suspension パターン

ある処理を行うための条件(ガード条件)があり、条件が満たされている時にしか処理を行わない。

条件が満たされていないときは、条件が満たされるまで待つ。

f:id:sissoko:20190321104902p:plain

@startuml
CreateThread -> ComplexData : createData
ClientThread -> ComplexData : getData
note right:  wait for creating complex data

... long data create process ...

ComplexData -> CreateThread : finish createData
note right: notify data is ready to waiting threads
ComplexData -> ClientThread : return data
ClientThread -> ComplexData : getData
note right: return immediately if already data created
ComplexData -> ClientThread : return data
@enduml

気が向いたら他のパターンも。。

android AsyncTask

androidのAsyncTaskも1つの具体的目なマルチスレッドのパターンだなということで。

f:id:sissoko:20190321111455p:plain

@startuml
ClientThread -> DownloadFileTask : execute

DownloadFileTask -> UIThread : onPreExecute
activate UIThread
UIThread -> DownloadFileTask : return onPreExecute
deactivate UIThread

DownloadFileTask -> BackgroundThread : doInBackground
activate BackgroundThread

DownloadFileTask -> UIThread : onProgressUpdate
activate UIThread
UIThread -> DownloadFileTask : return onProgressUpdate
deactivate UIThread
DownloadFileTask -> UIThread : onProgressUpdate
activate UIThread
UIThread -> DownloadFileTask : return onProgressUpdate
deactivate UIThread

...

BackgroundThread -> DownloadFileTask : return doInBackground
deactivate BackgroundThread

DownloadFileTask -> UIThread : onPostExecute
activate UIThread
UIThread -> DownloadFileTask : return onPostExecute
deactivate UIThread

@enduml