next up previous
: 課題 1 : プリエンプティブスレッド : プリエンプティブスレッド

1 つのスレッド

では,スレッドの例をワイヤフレームを使って示そう. ワイヤフレームとして,以下のインタフェースを定義しよう (ファイル名 WireFrame.java).
interface WireFrame {
  public void Draw(Graphics g);
  public void Rotate();
}
この WireFrame を実現し,回転体を描くクラス FreeSoR を 示そう(ファイル名 FreeSoR.java).
import java.awt.*;
import java.io.*;
import java.lang.*;
import java.applet.*;
public class FreeSoR
    implements WireFrame {
  private int xx[] =
    {70,40,30,20,20,30,20,30,70,70};
  private int yy[] =
    {-100,20,30,40,60,70,80,90,94,100};
  private double x[][]=new double[10][10];
  private double y[][]=new double[10][10];
  private double z[][]=new double[10][10];
  private double alpha=Math.PI/15;
  private double beta=Math.PI/15;
  private double gamma=Math.PI/15;
  private double delta=Math.PI/5;
  private Dimension s; private int n;
  FreeSoR(Dimension s,int n) {
    this.s = s; this.n = n; 
    for( int i=0; i<10; i++ ) {
      x[0][i] = xx[i]; y[0][i] = yy[i];
      z[0][i] = 0;
    }
    double x1, z1;
    for( int i=0; i<9; i++ )
      for( int j=0; j<10; j++ ) {
        x1 = x[i][j]; z1 = z[i][j];
        x[i+1][j]=x1*Math.cos(delta)+
                  z1*Math.sin(delta);
        y[i+1][j]=y[i][j];
        z[i+1][j]=-x1*Math.sin(delta)+
                   z1*Math.cos(delta);
      }
  }
  public void Draw(Graphics g) {
    g.setColor(Color.black);
    int h = n / 3; int v = n % 3;
    int x1, y1, x2, y2;
    int wu = s.width/3;
    int hu = s.height/4;
    for( int i=0; i<10; i++)
      for( int j=0; j<10; j++) {
        x1=(int)(x[i][j]/3)+(h+1)*wu;
        y1=(int)(y[i][j]/3)+(v+1)*hu;
        x2=(int)(x[(i+1)%10][j]/3)+
          (h+1)*wu;
        y2=(int)(y[(i+1)%10][j]/3)+
          (v+1)*hu;
        g.drawLine(x1,y1,x2,y2);
      }
    for( int i=0; i<10; i++)
      for( int j=0; j<9; j++) {
        x1=(int)(x[i][j]/3)+(h+1)*wu;
        y1=(int)(y[i][j]/3)+(v+1)*hu;
        x2=(int)(x[i][(j+1)%10]/3)+
          (h+1)*wu;
        y2=(int)(y[i][(j+1)%10]/3)+
          (v+1)*hu;
        g.drawLine(x1,y1,x2,y2);
      }
  }
  public void Rotate() {
    double x1,x2,x3,y1,y2,y3,z1,z2;
    for( int i=0; i<10; i++ )
      for( int j=0; j<10; j++ ) {
        x1=x[i][j];y1=y[i][j];
        z1=z[i][j];x2=x1;
        y2=y1*Math.cos(alpha)-
           z1*Math.sin(alpha);
        z2=y1*Math.sin(alpha)+
           z1*Math.cos(alpha);
        x3=x2*Math.cos(beta)+
           z2*Math.sin(beta);
        y3 = y2;
        x[i][j]=x3*Math.cos(gamma)-
                y3*Math.sin(gamma);
        y[i][j]=x3*Math.sin(gamma)+
                y3*Math.cos(gamma);
        z[i][j]=-x2*Math.sin(beta)+
                 z2*Math.cos(beta);
      }
  }
}
このクラス FreeSoR のインスタンスを生成し,メソッド Rotate を 呼出すことにより回転体を回転するスレッドを生成しょう
(ファイル名 Sample.java).
import java.awt.*;
import java.applet.*;
public class Sample extends Applet 
    implements Runnable {
  private FreeSoR l;
  public void init() {
    l = new FreeSoR(size(),0);
    Thread t = new Thread(this);
    t.start();
  }
  public void paint(Graphics g) {
    l.Draw(g);
  }
  public void run() {
    while(true) { l.Rotate(); repaint(); }
  }
}
このアプレットは,
init により クラス FreeSoR のインスタンスを 一つ作りスレッドとして起動する.関数 size は, Dimension ク ラスのインスタンスを表し,現在の表示領域の大きさを保持している. スレッドとして起動されると,メソッド run が呼出されるので,その中で,クラス FreeSoR のインスタンスの Rotate を連続的に呼出す.その間に repaint を呼出すことによ り,図形を再描画している.

このアプレットを実行するためには,以下の HTML ファイルを必要とする(ファイル名 Sample.html).

<applet code="Sample.class" width=400
    height=400></applet>
このアプレットを実行すると図4 のようになる.
図 4: スレッド 1つ
\begin{figure}\begin{center}
\epsfile{file=Image1.eps,width=8cm,height=9.1cm}
\end{center}\end{figure}



平成12年8月9日