[Java]Threadを用いて同期・非同期処理のサンプルコードを書く

前回は、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を使った開発にも携われたら嬉しく思います。


弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*