アプレットでのスレッドの利用

広告

長々とスレッドの話をしてきましたが、いよいよアプレットでスレッドを使う方法を見ていきます。

アプレットの基本形を今一度見て下さい。

import java.applet.Applet;
import java.awt.Graphics;

public class ThreadTest extends Applet{
  public void init(){
    // 初期化処理
  }

  public void paint(Graphics g){
    // 描画処理
  }
}

アプレットはAppletクラスのサブクラスであり、アプレットが最初に作成された時にinitメソッドが呼び出され、またアプレットの描画が必要になった時にpaintメソッドが呼ばれます。

そして重要な点はアプレットはブラウザと言うアプリケーションの一部の機能として動いています。メインのスレッドはブラウザで動いているわけです。ブラウザのスレッドは必要な時にinitメソッドを実行しにやってきますし、paintメソッドを実行しにやってきます。そしてすぐにブラウザの方へ戻って行きます。もしそうでなければブラウザでアプレットを表示しているページ以外のページを表示したりブラウザを閉じるといった処理が行えません。

そこでアプレット用として新規にスレッドを作成し、アプレット内での処理を任せる必要があります。そして新しいスレッドとして動かすクラスはこのアプレットクラスそのものになります。つまりアプレットは新規にスレッドを作成するクラスでもありますし、その新しく作られたスレッドの中で動くクラスでもあるわけです。

そこでまずこのクラスをスレッドとして動かすことが出来るようにしなければいけません。スレッドとして動かす為にはThreadクラスのサブクラスとするか、Runnableインターフェースを実装する必要がありますが、このクラスは既にAppletクラスのサブクラスであるためさらにThreadクラスのサブクラスには出来ません。よってRunnableインターフェースを実装することになります。

import java.applet.Applet;
import java.awt.Graphics;

public class ThreadTest extends Applet implements Runnable{
  public void init(){
    // 初期化処理
  }

  public void paint(Graphics g){
    // 描画処理
  }

  public void run(){
    // スレッド開始時のスタート地点
  }
}

次に新規にスレッドを作成します。メインで動いているブラウザの方で新規にスレッドを作成して云々ということはもちろん出来ませんので、アプレットの内部でスレッドを作成します。どのタイミングで作成するかは場合によりますが、通常はアプレットが最初に開始された時にスレッドを作成します。その為initメソッド内でスレッドを作成しましょう。またThreadクラスのオブジェクトを作成する時に指定する引数にはスレッドとして動かすクラスを指定するのでしたから、今回の場合は自分自身である「this」を指定します。

import java.applet.Applet;
import java.awt.Graphics;

public class ThreadTest extends Applet implements Runnable{
  Thread thread = null;

  public void init(){
    thread = new Thread(this);
    thread.start();
  }

  public void paint(Graphics g){
    // 描画処理
  }

  public void run(){
    // スレッド開始時のスタート地点
  }
}

initメソッドはアプレットが最初に開始された時に、メインのスレッドが動いているブラウザから呼び出されるメソッドです。このメソッド内で新しくスレッドを作成し、そのスレッドを開始します。メインのスレッドはこの処理が終わればブラウザに戻って行きますのでブラウザの動作には影響を与えません。そして新しく動き出したスレッドはスレッドが動き出した時に呼び出されるrunメソッドを内部的に呼び出すわけです。

サンプル

アプレットを使ってスレッドを動かす場合の手順は確認できました。後はrunメソッド内にアプレットで処理したいことを記述しておくことになります。ここに何を書くかは次のページで詳しく見ていきますので、とりあえずこの時点でのサンプルを試しておきましょう。

ThreadTest3.java

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;

/*
<applet code="ThreadTest3.class" codebase="class" width="150" height="150">
</applet>
*/

public class ThreadTest3 extends Applet implements Runnable{

  Thread thread = null;
  int x, y;
  Color col;

  public void init(){
    x = 10;
    y = 10;
    col = new Color(255, 0 ,0);

    thread = new Thread(this);
    thread.start();
  }

  public void paint(Graphics g){
    g.setColor(col);
    g.drawOval(x, y, 50, 50);
  }

  public void run(){
    while(true){
      x = (int)(Math.random() * 100);
      y = (int)(Math.random() * 100);

      int red = (int)(Math.random() * 255);
      int green = (int)(Math.random() * 255);
      int blue = (int)(Math.random() * 255);
      col = new Color(red, green, blue);

      repaint();
    }
  }
}

上記を実際に実行してみると下記のようになります。

アプレットでのスレッドのテスト

今回はランダムな位置にランダムな色で円を描き続けるというサンプルです。画像では分かりにくいと思いますので、下記で実際に試してみて下さい。

ThreadTest3.html

( Written by Tatsuo Ikura )