minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

Android では、最初に何らかのアプリケーションコンポーネントを実行する必要が生じると
そのための Linux Process を作成し、その中で Thread を一つだけ作ります。
デフォルトでは、その後に実行するコンポーネント群は全てその Thread で実行されます。

全てのコンポーネントは、必ず Process の Main Thread でインスタンス化されます
コンポーネントに対するシステムコールも、常に Main Thread から Dispatch されます。

ある一つのコンポーネントインスタンスでは、必ず一つのスレッドしか作成されません。
これはインスタンス内のコードでは Multi Thread を意識する必要が無いということです。
※ 一つのインスタンスが複数のスレッドから参照されることは無い

そしてこれは、コンポーネントとシステムコール(キー押下など)は全て
同一の Thread 内で実行されることも意味します。
システムコールの処理に長い時間を掛けていると、同じプロセスに存在する他の全てのコンポーネントに
影響を与えることになります。

実行に時間が掛かる処理は、新しく Thread を生成してそこで実行させることができます(後述)。

状況に応じて、Android はある Process を終了させるべきという判断をすることがあります。
このとき、その Process で実行されているコンポーネントは全て破棄されます。
これらのコンポーネントで処理する作業がもう一度発生すると、そのための Process が再び開始されます。

Thread

Android では、Java標準ライブラリの Thread を使ってスレッドを作ることができます。
そのための便利なクラスが数多く用意されています。
Looper, Handler, HandlerThread などです。

Remote Procedure Call

Android は軽量な仕組みの Remote Procedure Call(以下 RPC)を採用しています。

RPC によりリモートメソッドを呼び出すと、そのメソッド処理が完了するまで呼び出し側の Thread はブロックされます。

RPC の実装には、まず IDL を使用して RPCインターフェイスを定義します。
そして aidl ツールを使えば、Java インターフェイス定義が生成されます。

スレッドセーフなプログラミング

前述したように、コンポーネントの中では完全な Single Thread が保障されています。
しかし Thread を新しく作る場合には、スレッドセーフなプログラミングをする必要が出てきます。