Java

【Java】マルチスレッドの実装方法

はじめに

今回はJavaのマルチスレッドの実装方法について解説します。
マルチスレッドは複数の処理を並行して行いたい場合に使用します。

また、マルチスレッドはThreadというクラスを使用するのですが、
Threadクラスでよく使用するメソッドを紹介したいと思います。

以降、以下のバージョン、環境での解説となります。

IDE:eclipse
Javaバージョン:8
OS:Mac OS

それでは、早速解説していきます。

フォルダ構成

今回作成するサンプルソースのフォルダ構成は以下の通りです。

スクリーンショット 2018-11-12 20.57.13.png

マルチスレッド処理の実装

1. サンプルプログラム概要

今回サンプルで実装する内容ですが、メインクラスである「Main.java」を起動し、サブクラスである「SubThreadA.java」と「SubThreadB.java」を並列でスタートさせるという基本的なプログラムを実装します。

2. サブクラスの実装

まずは今回並列で処理させたいサブクラスの実装を行います。

マルチスレッドのプログラムを作成するには、Threadクラスを継承し、そのクラスでrunメソッドを記述します。

今回のサンプルプログラムでは、それぞれのスレッドで以下のような文言がコンソールに出力されるようなプログラムを実装していきましょう。

SubThreadA.java → 「スレッドAを開始しました。」
SubThreadB.java → 「スレッドBを開始しました。」

3. メインクラスの実装

次に先ほど作成したスレッドを起動させる処理をメインクラスへ実装します。

実装方法ですが、先ほど作成したサブクラスのオブジェクトからstartメソッドを呼び出すことでrunメソッドの処理がマルチスレッドで開始されます。

以下のように記述します。

それでは、先ほどの「SubThreadA」と「SubThreadB」を呼び出す処理を記述していきましょう。

上記記述完了しましたら、Main.javaを右クリック>Javaアプリケーションの実行で実行してみましょう。
コンソール画面に以下の文言が出力されていればOKです。

コンソール
スレッドAを開始しました。
スレッドBを開始しました。

4. sleepメソッドの実装

ここではThreadクラスのsleepメソッドでスレッドを一定時間停止する方法を解説します。

sleepメソッドは引数に停止させたい時間をミリ秒単位で指定して使用します。
(1000ミリ秒 = 1秒)

また、sleepメソッドでは、割り込み等でInterruptedExceptionの例外が発生する可能性があるのでtry-catch文で囲み例外処理をする必要があります。

それでは今回は、「SubThreadA」を3秒遅らせて実行してみましょう。

Main.javaを右クリック>Javaアプリケーションの実行で実行してみましょう。
スレッドBの3秒後にスレッドAが開始され、コンソール画面に以下の順番で文言が出力されていればOKです。

5. joinメソッドの実装

joinメソッドは別のスレッドの処理が終了するまで待機したい場合に使用します。
終了するかどうか監視したいスレッドのオブジェクト.join()とコーディングします。

また、sleepメソッドと同様に、割り込み等でInterruptedExceptionの例外が発生する可能性があるのでtry-catch文で囲み例外処理をする必要があります。

それでは、「SubThreadA」の処理が終了してから「SubThreadB」の処理を行うようにしてみましょう。

Main.javaを右クリック>Javaアプリケーションの実行で実行してみましょう。
少し時間が経ってから、スレッドA→Bの順で実行され、コンソール画面に以下の文言が出力されていればOKです。

さいごに

簡単ですが、マルチスレッド処理の実装を紹介させていただきました。

Threadクラスには他にもいろいろなメソッドはあるのですが、実際の現場ではあまり使用しないので、今回ご紹介したメソッドを使用できるようにしておけば特に問題ないかと思います。

マルチスレッドの実装を忘れたりつまづいたら、ぜひ参考にしていただければと思います。