Going my way

いいなと思ったことをメモしていきます。

Javaでマルチスレッドの基本のまとめ


Advertisements


スレッドとは

アプリケーションプログラムには、アプリケーションの命令を最初から1つずつ順番に実行するための実行制御があります。
このような実行制御の流れを実行スレッドと呼びます。
すべてのアプリケーションには少なくとも1つの実行スレッドが存在します。
マルチスレッド環境では、複数のスレッドを作成することができます。


Javaは1つのプログラムの中で同時に異なる計算処理を行うことが可能です。
1つの計算書林の単位を1スレッドといい、複数のスレッドを同時に実行させることをマルチスレッドと言います。

スレッドの生成方法
①Threadオブジェクトを作成する
② ①で作成したThreadオブジェクトのstartメソッドを呼び出す。すると、オーバーライドされたrunメソッドが呼び出され、処理が行われる。

①のThreadオブジェクトを作成する方法は2つあります。

方法1.Threadクラスを継承するサブクラスを作成し、サブクラスのオブジェクトを生成する。

方法2.Threadクラスのコンストラクタの引数にRunnableインターフェースを指定し、Threadオブジェクトを生成する。


方法1のサンプルを見てみましょう。

package thread;

public class ThreadSample1 {
	public static void main(String[] args){
		//Threadオブジェクトを生成し、参照する
		MyThread thread = new MyThread();
		//もう一つのThreadオブジェクトを生成し、参照する
		MyThread2 thread2 = new MyThread2();
		
		//mainメソッドも走っています。
		System.out.println("now! main Thread running!!");
		
		//スレッド1を走らせます
		thread.start();
		
		//スレッド2を走らせます
		thread2.start();
		
		for(int i = 0;i < 5; i++){
			try{
				Thread.sleep(100);
			} catch(InterruptedException e){
				
			}
			System.out.println("i =" + i);
		}
	}
}

class MyThread extends Thread {
	public void run(){
		for(int j = 0; j<10000;j++){
			System.out.println("j=" + j);
		}
		
		System.out.println("J run end!!");
	}
}

class MyThread2 extends Thread{
	public void run(){
		for(int k = 0; k<10000; k++){
			System.out.println("k=" + k);
		}
		
		System.out.println("K run end!!");
	}
	
}

Threadクラスを継承したMyThreadとMyThread2クラスをインスタンス化しました。
threadのstart()メソッドを実行することで、MyThreadの中のrunが走り出します。

実行結果はこうなります。

k=4614
j=8480
k=4615
~~~
j=9999
k=7873
J run end!!
~~~
k=9999
K run end!!
i =1
i =2
i =3
i =4

mainのスレッドとMyThreadとMyThreadが並列的に実行されていることがわかります。

次に方法2のパターンを見てみましょう。
>方法2.Threadクラスのコンストラクタの引数にRunnableインターフェースを指定し、Threadオブジェクトを生成する。

package thread;

public class ThreadSample2 {
	public static void main(String[] args){
		Thread thread = new Thread(new Runnable(){
			public void run(){
				for(int i = 0; i <5; i++){
					try{
						Thread.sleep(1);
					}catch(InterruptedException e){}
					System.out.println("run end!");
				}
			}
		});
		
		thread.start();
		
		for(int j=0; j < 500; j++){
			System.out.println("j="+j);
		}
		
		System.out.println("main end!");
	}
}

Runnableインターフェースを実装したクラスのオブジェクトをコンストラクタに指定することでスレッドが生成されます。
startメソッドの呼び出しでスレッドは実行可能な状態になります。

実行結果は以下の通り

~
j=488
run end!
j=489
~
j=499
main end!
run end!

スレッドが並行で走っていることが確認できます。