前回は、Unityを使って3Dモデルをキーボード操作で動かしてみようでした。
今回は、JavaのThreadを用いて同期・非同期処理のサンプルコードを書きます。
以前の記事で、同期・非同期処理について説明しました。
その続きとして、同期・非同期処理のサンプルコードを書いていきたいと思います。
早速ですが、Threadの制御をするために必要な、
Threadのメソッドについて説明したいと思います。
◇Threadクラスに用意されているメソッド
下記にこのクラスを使用するにあたって、
Threadクラスに定義されているメソッドを簡単に説明したいと思います。
■startメソッド
スレッドの処理を開始させるメソッドです。
startメソッドが呼ばれたら、runメソッドの処理が走ります。
■runメソッド
スレッドの処理を書くためのメソッドです。
オーバーライドして使います。
■sleepメソッド
スレッドの進行を遅らせるためのメソッドです。
引数にミリ秒単位で停止させる時間を記述します。
このメソッドは、例外を発生させるため、try catchをいれなくてはいけません。
※例外とは、プログラムの実行中にエラーが発生することを指しています。
今回は上記3つのメソッドを使ってサンプルコードを書いていきます。
◇実際にサンプルコードを書く
前提として、今回はメインスレッドで、1~10、
サブスレッドと同期処理の関数で11~20の数字を出力する処理を書きます。
※今回、処理の流れを分かりやすくするため、同期・非同期処理でsleepメソッドを使っています。
■同期処理
メインスレッドのfor文の変数iが5になったら、doSyncメソッドをを呼ぶように処理を書きます。
doSyncの処理は、非同期処理のSubThreadのrunメソッドと同じにします。
public class MainThread { public static void main(String args[]) { MainThread main = new MainThread(); for(int i = 0 ; i <= 10 ; i++) { System.out.println("メインスレッドの回数: "+i); if(i == 5) { main.doSync(); } try { Thread.sleep(100); } catch(InterruptedException e) { //例外が発生した場合、ここに処理が通る } } } public void doSync() { for (int i = 11; i<=20 ; i++) { System.out.println("同期処理の回数: "+i); try { Thread.sleep(100); } catch(InterruptedException e) { //例外が発生した場合、処理が通る } } } }
実行結果は以下のようになりました。
———————————————-
メインスレッドの回数: 0
メインスレッドの回数: 1
メインスレッドの回数: 2
メインスレッドの回数: 3
メインスレッドの回数: 4
メインスレッドの回数: 5
同期処理の回数: 11
同期処理の回数: 12
同期処理の回数: 13
同期処理の回数: 14
同期処理の回数: 15
同期処理の回数: 16
同期処理の回数: 17
同期処理の回数: 18
同期処理の回数: 19
同期処理の回数: 20
メインスレッドの回数: 6
メインスレッドの回数: 7
メインスレッドの回数: 8
メインスレッドの回数: 9
メインスレッドの回数: 10
————————————————-
次は非同期処理についてです。
■非同期処理
サブスレッドを使用し、doSyncを呼んでいたif文の中でsubThread.statメソッドを呼び、
非同期処理を作ってみたいと思います。
public class MainThread { public static void main(String args[]) { SubThread subThread = new SubThread(); for(int i = 0 ; i <= 10 ; i++) { System.out.println("メインスレッドの回数: "+i); if(i == 5) { subThread.start(); //main.doSync()→subThread.start()に変更 } try { Thread.sleep(100); } catch(InterruptedException e) { //例外が発生した場合、ここに処理が通る } } } } public class SubThread extends Thread { public void run() { for (int i = 11; i<=20 ; i++) { System.out.println("サブスレッド(非同期処理)の回数: "+i); try { sleep(100); } catch(InterruptedException e) { //例外が発生した場合、処理が通る } } } }
実行結果は以下のようになりました
———————————–
メインスレッドの回数: 0
メインスレッドの回数: 1
メインスレッドの回数: 2
メインスレッドの回数: 3
メインスレッドの回数: 4
メインスレッドの回数: 5
サブスレッド(非同期処理)の回数: 11
サブスレッド(非同期処理)の回数: 12
メインスレッドの回数: 6
サブスレッド(非同期処理)の回数: 13
メインスレッドの回数: 7
サブスレッド(非同期処理)の回数: 14
メインスレッドの回数: 8
サブスレッド(非同期処理)の回数: 15
メインスレッドの回数: 9
メインスレッドの回数: 10
サブスレッド(非同期処理)の回数: 16
サブスレッド(非同期処理)の回数: 17
サブスレッド(非同期処理)の回数: 18
サブスレッド(非同期処理)の回数: 19
サブスレッド(非同期処理)の回数: 20
———————————
このように、subThreadを途中で実行し、並列処理を行わせることも可能です。
◇最後に
今回は、javaのThreadクラスを用いて同期・非同期処理のサンプルコードを書きました。
この記事を書くために、javaのThreadについて、勉強して少し詳しくなることが出来たので
javaを使った開発にも携われたら嬉しく思います。
弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。