スレッドとは、プログラムの最小実行単位です。
アニメーションのようにグラフィックスを動かす場合や、ネットワーク通信時に待つ場合などに使われます。
スレッドは、java.langに含まれていて、使う場合には、Threadクラスをextends(継承)するか、Runnableインターフェイスをimplementsする必要があります。
メソッドとしては、runメソッドの実装が必要です。
スレッド間の同期方法については、マルチスレッドの同期も参照してください。
スレッドは、Threadオブジェクトを生成し、startメソッドを呼ぶことで起動されます。
生成したThreadインスタンスは、thなどの変数に格納します。
変数を使わない場合、Thread.currentThread();で、自分のスレッドを取得することもできます。
実際の処理は、runメソッドで実行しますので、必要な処理を実装する必要があります。
runメソッドは、スレッドが終了するまで、動作し続けます。
タイマ割り込みを使って、一定時間毎の処理を組み込みたい場合は、sleepメソッドにミリ秒単位の割り込み間隔を指定します。
アプレットでアニメーション表示する場合には、repaintメソッドで画面を再表示します。
他のスレッドなどと同期を取る場合は、waitメソッドで待ちます。
スレッドの停止は、stopメソッドは使わずに、インスタンス変数をnullにすることで、終了します。
・Runnableインターフェイスをimplements
class クラス名 implements Runnable {
Thread th;
.....
}
・スレッドの生成と起動
th = new Thread(this);
th.start();
・スレッドの実行(タイマ割り込みの場合)
public void run() {
while(th != null) {
表示などの処理
try {
Thread.sleep(割り込み間隔);
} catch(Exception ex) {
}
}
}
・スレッドの停止
th = null;
|
スレッドを使ったアップレットで、動く Hello World!を表示してみます。
以下のアプレットのソースを入力します。
| HelloRun.java |
|---|
import java.applet.*;
import java.awt.*;
public class HelloRun extends Applet implements Runnable {
Thread th = null;
int x = 0;
// 表示処理
public void paint(Graphics g){
g.drawString("Hello World!", x, 50);
x = x + 20;
if (x > 500) { x = 0; }
}
public void start() {
// スレッド開始
th = new Thread(this);
th.start();
}
public void run() {
// スレッド実行処理
while(th != null) {
repaint();
try {
Thread.sleep(200);
} catch(Exception ex) {
}
}
}
public void stop() {
// スレッド終了
th = null;
}
}
|
アプレットを実行するためのHTMLファイルを作成し、ブラウザで表示します。
| HelloRun.htm |
|---|
<html> <head> <title>動く Hello World!</title> </head> <body> <h1>動く Hello World!</h1> <applet code="HelloRun.class" width="500" height="100"></applet> </body> </html> |
実行結果は、こちらをクリックしてください。
Hello World!という文字が左から右に動きます。
今度は、プログラムでタイマ割り込みを使ってみましょう。
以下のソースを入力してください。
| HelloThread.java |
|---|
public class HelloThread implements Runnable {
Thread th;
int pause;
public static void main(String args[]) {
HelloThread hello;
// スレッドの起動
hello = new HelloThread();
hello.start();
// 1秒間待つ
try {
Thread.sleep(1000);
} catch (Exception ex) {
}
// 全スレッドの停止
hello.stop();
}
public HelloThread() {
}
public void start() {
// スレッド開始
th = new Thread(this);
th.start();
}
public void run() {
// スレッド実行処理
while(th != null) {
System.out.println("Hello World!");
try {
Thread.sleep(200);
} catch (Exception ex) {
}
}
}
public void stop() {
// スレッド終了
th = null;
}
}
|
コンパイルして実行すると、子スレッドを作成し、0.2秒毎に「Hello World!」を表示します。 親スレッドでは、1秒後に、スレッドを停止しています。
unix# javac HelloThread.java unix# java HelloThread Hello World! Hello World! Hello World! Hello World! Hello World! |