libro
www.tuyano.com
初心者のためのJava SEプログラミング入門

スレッドとアニメーション (4/9)

作成:2010-01-14 21:10
更新:2010-01-14 21:22

■runメソッド処理の流れを整理する

さて、スレッド内で実行できるクラスは、その内部に「run」というメソッドを持っていなければいけません。Threadインスタンスを作成し、startすると、Java仮想マシンはスレッドに設定されたインスタンス内のrunメソッドを実行するようになっています。これは、Javaコマンドでクラスを実行するとmainメソッドが実行されるのと同じような感覚で考えるとよいでしょう。すなわち、このrunメソッド内に、スレッドで実行する処理を書いておけば、それがメインスレッドと平行して実行されるようになるというわけです。

下に掲載したリストが、このクラスに用意されているrunメソッドです。まず目を引くのは、try内で処理が実行されているということです。これは、後述しますが処理を一時的に停止するsleepというメソッドがエラー(Javaでは「例外」と呼びます)を発生させる可能性があるから、その予防措置です。

そして第2の疑問が、「while(true)」でしょう。どうやら円を動かしている部分は、この繰り返し構文の中で処理を行なっているようです。が、while(true)というのは、whileの終了条件がtrueである、ということです。ということは「死ぬまで回ってろ」ということになりますね。

終了しない、無限ループなわけです。こんなこと、普通は許されません。が、スレッド内で処理されるものについてはこれが許されるのです。なぜなら、メインスレッドが終了すると、このように新たに作成されたスレッドは自動的に消えてしまうからです。

○||と&&について○
その中では、まずlastXとlastYがMyCanvasの外側に出てしまった時の処理があります。ここでは「||」という見なれない記号が使われていますね。これは、記号の前後にある条件のいずれか片方が成立すればtrueとみなす、という働きをします。例えば、

if (A == 0 || B == 0) { …

なんて具合にすれば、AとBのどちらかが0であれば処理を実行するようなものが作れるわけです。――この反対に、「両方とも正しくないとtrueにならない」というものもあります。「&&」というのがそれで、

if (A == 0 && B == 0) { …

なんてすれば、AとBの両方が0でないと実行しないという処理が書けます。

○スレッドをスリープする○
最後に、MyCanvas(c1)をrepaintした後で、「t1.sleep(100);」というのを実行していますね。これは、一定時間、スレッドの処理を停止するものです。パラメータにはミリ秒(1000分の1秒)の値が入ります。つまりsleep(100)ならば、0.1秒停止することになるわけです。これで、スピードの調整を行なっていたわけですね。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※スレッドで実行される処理
	public void run(){
		try {
			lastX = 0;
			lastY = 0;
			while(true){
				if (lastX + moveX < 0 || lastX + moveX > c1.getWidth()){
					moveX *= -1;
				}
				if (lastY + moveY < 0 || lastY + moveY > c1.getHeight()){
					moveY *= -1;
				}
				lastX += moveX;
				lastY += moveY;
				c1.repaint();
				t1.sleep(100);
			}
		} catch(Exception e){
			System.out.println(e);
		}
	}
※関連コンテンツ

「初心者のためのJava SEプログラミング入門」に戻る