スレッドとは、プログラムの最小実行単位です。
アニメーションのようにグラフィックスを動かす場合や、ネットワーク通信時に待つ場合などに使われます。
スレッドは、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! |