ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

マルチスレッドプログラミング

スレッドとは

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

 スレッドを使ったアップレットで、動く 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!という文字が左から右に動きます。

別スレッドで 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!


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp