マルチスレッド


同時に別の処理を行う

マルチスレッドというものの概念は、情報技術全般の分野です
そもそも、マルチスレッドとは何かを詳しく知りたければ、情報技術の勉強をしてください
この場ではJava言語での、マルチスレッドプログラミングの方法を紹介します

マルチスレッドとはプログラムの並列実行だと思ってくれて良いでしょう
マルチスレッドは資源(リソース)を有効利用することにあります
N88BASICのように、意味のない計算によるウェイト(待ち)をかける必要はないのです

マルチスレッドの恩恵は、AWTによるグラフィカルJavaプログラミングのときに受けます
たとえば、二つのボールが動的に動き続けるプログラムを想像して下さい
グラフィカルJavaプログラミングは、基礎編を十分に書き終えてから紹介します

スレッドの状態は新規作成、使用可能、実行、待機、破棄の5種類に分けられ
スレッドの作成には2種類の方法があります
ひとつは java.langパッケージのThreadクラスを拡張する方法です
このクラスにrun()メソッドを定義し、そこにスレッドの処理を記述します

作成したスレッドを実行するにはstrat()メソッドを使用します
start()メソッドはオブジェクトのrun()メソッドを呼び出します

objName.start();

次のプログラムはスレッドを作成し実行しています
もちろん、これだけではスレッドの意味はありません
ですが、まずスレッドの作成と実行という基本を理解しましょう
class test {
	public static void main(String args[]) {
		Hizapa1 Rena = new Hizapa1();
		Rena.start();
	}
}

class Hizapa1 extends Thread {
	public void run() {
		for(int count = 0 ; count < 1000 ; count++) {
			System.out.println("Kitty on your lap");
		}
	}
}
もうひとつの、スレッドの作成方法はRunnableインターフェイスをインプリメントします
Runnableインターフェイスはrun()メソッドを宣言しているだけです
public interface Runnable {
	public abstract void run();
}
これをサブクラスで詳細を実装して、Threadコンストラクタにこのクラスのオブジェクトを渡します
そして、インスタンス化したThreadクラスのオブジェクトをstart()メソッドで実行します

アプレットはAppletクラスを拡張しなければいけませんので、こちらの方法を使用します
アプレットの詳細は後ほど詳しく説明します
この場ではアプレットの場合はこの方法でスレッドを使用するとだけ覚えてください
class test {
	public static void main(String args[]) {
		Hizapa1 obj = new Hizapa1();
		Thread Rena = new Thread(obj);
		Rena.start();
	}
}

class Hizapa1 implements Runnable {
	public void run() {
		for(int count = 0 ; count < 1000 ; count++) {
			System.out.println("Kitty on your lap");
		}
	}
}
インスタンスの生成部分は、上級Javaプログラマが記述した文章では次のようになっているでしょう
このような記述方法があるということも知ってください

Thread Rena = new Thread(new Hizapa1());
Rena.start();

Threadクラスのコンストラクタは、Runanbleインターフェイスを実装したオブジェクトの参照を受け取れます
先ほどは、別の行でRunnableを実装したオブジェクトを作成し、それを渡していましたが
このように引数ないでオブジェクトを作成して渡すという方法もあるのです

次にsleep()メソッドを使用した実用的なスレッドプログラムを作りましょう
sleep()は、Threadクラスに直接結び付けられた静的メソッドです
sleep()メソッドはオーバーロードされていて、long型とint型を受け取ることができます

public static native void sleep( long millis ) throws InterruptedException
public static void sleep( long millis, int nanos ) throws InterruptedException

millisには、ミリ秒、nanosにはナノ秒のを指定します
このメソッドは、指定秒だけ待機します
ミリ秒とナノ秒が指定されている場合は ミリ秒 + ナノ秒 だけ待機します

InterruptedException例外クラスは、何らかの理由でスレッドが待機中のとき
別のスレッドが割り込んできた時に発生する例外です
RuntimeExceptionではないので、キャッチするかスローしなければなりません
class test {
	public static void main(String args[]) {
		Hizapa Rena = new Hizapa();
		Rena.start();
	}
}

class Hizapa extends Thread {
	public void run() {
		try {
			for(int count = 0 ; count < 10 ; count++) {
				System.out.println("Kitty on your lap");
				Thread.sleep(1000);
			}
		}
		catch (InterruptedException err) {
			System.out.println(err);
		}
	}
}
これで、文字列が10秒(1000ミリ秒)ごとに出力されます
この感覚は、マルチスレッドプログラミングが初体験の方には感動的だと思います

次のように、複数のスレッドを走らせることもできます
こうすることで、平行的な作業を完結的にプログラムすることができます
class test {
	public static void main(String args[]) {
		Hizapa Rena = new Hizapa();
		CCS sakura = new CCS();
		Rena.start();
		sakura.start();
	}
}

class Hizapa extends Thread {
	public void run() {
		try {
			for(int count = 0 ; count < 5 ; count++) {
				System.out.println("Kitty on your lap");
				Thread.sleep(1000);
			}
		}
		catch (InterruptedException err) {
			System.out.println(err);
		}
	}
}

class CCS extends Thread {
	public void run() {
		try {
			for(int count = 0 ; count < 10 ; count++) {
				System.out.println("Card Captor SAKURA");
				Thread.sleep(500);
			}
		}
		catch (InterruptedException err) {
			System.out.println(err);
		}
	}
}
スレッドは、実用的プログラミングには欠かせない技術であることがわかると思います
スレッドプログラムを、自分でいろいろプログラムして研究してください



前のページへ戻る次のページへ