Android(Java)のマルチスレッド

最近は、複数のCPUコアを持つAndroid端末が当たり前になってきました。

開発者としては、マルチコアCPUの並列処理能力を存分に活用して、高性能なAndroidアプリを開発したいところですね。幸い、Androidアプリに使うJavaには標準でマルチスレッドの仕組みが用意されています。

Javaでスレッドを作成する時には、まずRunnableインターフェースを実装したオブジェクトを作成します。Runnableインターフェースはスレッドで実行する処理を記述するrun()メソッドを持っているので、このrun()メソッドにスレッドで行いたい処理を記述するわけです。

Runnableインターフェースのrun()メソッドを実装したオブジェクトは、処理単位としての関数をオブジェクト化した一種の関数オブジェクトになります。後は、その関数オブジェクトを、Threadクラスのコンストラクタに渡してThreadクラスのオブジェクトを作れば、run()メソッドに記述した処理を実行するスレッド(Threadオブジェクト)が作成されます。

new Thread(new Runnable() {
	public void run() {

	    ・・・スレッドで実行する処理・・・

	}
}).start();

Androidアプリでマルチスレッドを実現するには、まずイベントハンドラなどのメイン(UI)スレッドで実行される関数内でThreadを作成することになると思います。その時に問題になるのが、スレッド関数に渡すデータです。

イベントハンドラ内でRunnableインターフェースを実装するオブジェクトを作る場合、イベントハンドラのローカル変数をrun()内で使うことはできません。これが意外にやっかいで、スレッドにデータを渡すならアプリケーションやコンポーネントのクラスに変数を追加したりしないといけないんですね。