PHASE2 LOG

主にIT関連・ゲームのログ

Javaのお勉強~Threadクラスを使ったスレッド~

      2016/04/04

今回はスレッドについてお勉強です。

Javaではマルチスレッドプログラミングができるとかなんとかありますが、

私はその意味すら知らないのでそこからじっくり!

 

スレッドとは

 

スレッドとはプログラムの流れのことで、1つの処理の単位です。

Javaのプログラムを実行するとmain()メソッドが呼び出されて処理がはじまります。

これをメインスレッドといいますが、これもスレッドの1つです。

 

スレッドが1つしかないプログラムシングルスレッドといいます。

 

Javaではスレッドをいくつも作成して同時に実行させることができます。

このようにスレッドが複数あるプログラムマルチスレッドといいます。

 

Threadクラス

 

Javaでマルチスレッドを実行するにはクラスを利用する方法と、インタフェースを利用する方法の

2つの方法が存在します。

今回はクラスを使った方法について見てみます。

 

スレッドを扱うためのクラスがThreadクラスです。

 

スレッドを作るにはThreadクラスを継承させて、run()メソッドをオーバーライドします。

オーバーライドする際に処理を記述します。

 

また、作成したスレッドを実行するにはThreadクラスのstart()メソッドを使用します。

 

それでは実際の例を見てみましょう。

//Threadクラスを継承したクラス
public class ThreadTest extends Thread{
		private String str;
		private int time;
		private int count;
		
		//コンストラクタ
		public ThreadTest(String str, int time, int count){
			this.str = str;
			this.time = time;
			this.count = count;
		}
	//run()メソッドをオーバーライド
	public void run(){
		//指定した回数分(count)を繰り返す
		for(int i = 0; i < count; i++){
			System.out.print(str);
			
			try{
				//指定した時間(time)の間スレッドを停止
				sleep(time);
			//例外処理
			} catch (Exception e){
				System.out.println("例外が発生しました。");
			}
		}
	}

	public static void main(String[] args){
		//コンストラクタで各スレッドの文字列、停止時間、回数を設定
		ThreadTest a = new ThreadTest("ABC", 1000, 4);
		ThreadTest b = new ThreadTest("あいう\r\n", 1000, 3);
		
		//aのスレッドを実行
		a.start();
		try{
			//スレッドを500ミリ秒停止
			sleep(500);
		} catch (Exception e){
				
		}
		//bのスレッドを実行
		b.start();
	}
}

 

コンストラクタで出力したい文字列(str)と、停止する時間をミリ秒(time)で渡し、

出力する回数(count)を設定しています。

 

Threadクラスを継承したThreadTestのオブジェクトであるaでは

ABC1000ミリ秒(1秒)ごとに回出力」という風に実行されるわけです。

 

このスレッドを一時停止する処理を行うのがsleep()メソッドです。

 

上記のソースを図にするとこんな感じになります。

Thread

 

まずスレッドaが開始した後に、スレッドaは5000ミリ秒(0.5秒)一時停止します。

その後にスレッドbが実行され、スレッドaとスレッドbは1000ミリ秒(1秒)一時停止します。

 

スレッドaに対してスレッドbは0.5秒遅れて開始しているので

実行結果は以下のようにスレッドが交互に実行されているように見えます。

ABCあいう

ABCあいう

ABCあいう

ABC

 

私はスレッドは同時に実行されるものだからと0.5秒のズレを考慮せずにいたので

なぜOSに左右されずに交互に実行されているのか分からなくなりました(;´∀`)

 

プログラミングの質問サイトteratailにて解決したのでよかったらこちらも見てみてください!

https://teratail.com/questions/31471

 

人気ブログランキング

 -