Nanashi-softプログラマ専用Javaアプリケーション


◇Javaアプリケーション-スレッド-

◎スレッドとは?
同時に2つ以上の処理を行う際の単位です

Javaの場合,mainスレッドを頂点として,そこから子スレッドを生成します
mainスレッドが終了すると,全ての子スレッドは自動的に終了します

難しそうですが,実は既に使っています
マウス取得のプログラムのmainスレッドに無限ループを追加してみます

public class fst extends Frame{
  public static final void main(final String[] args){
〜〜省略〜〜
    //ウィンドウ表示
    app.setVisible(true);
    //無限ループ
    while (true){
      cvs.repaint();
    }
  }
}

これをビルドして実行すると,文字が再描画されて瞬きます。と同時にウィンドウ内をクリックするとマウス位置がDOSウィンドウに表示されます

mainスレッドしか走っていないのであれば,無限ループを作った時点でフリーズ状態になるはずです
少なくとも,キャンバスを描画するスレッドと,マウスを検知するスレッドが背後に走っているはずです(DOS画面はJavaとは無関係に動作していると思います)

◎スレッドの基本
Threadクラスを継承して使用します
ですが,既に Frameを継承しているので,Threadクラスを継承する事はできません
その変わりに Runnableインターフェイスを使います

public class fst extends Frame implements Runnable{

ここだけを変更してビルドすると,
fst は abstract でなく、java.lang.Runnable 内の abstract メソッド run() をオーバーライドしません。
と怒られます
と言うのも,インターフェイスを使用した場合,決められたメソッドを必ず記述しなければなりません
Rnnnableインターフェイスの場合は,Runメソッドを必ず定義しなければなりません

  public void run(){
    while (true){
      System.out.println("スレッド処理中");
    }
  }

これでビルドできるようになりました

次に,実際にスレッドを生成します

    //自分自身をもう1つ生成する
    fst fst2 = new fst();
    //それをスレッド化する
    Thread th = new Thread(fst2);
    //スレッドを走らせる
    th.start();

色々な方法があるのですが,これは自分自身の分身スレッドを生成する一例です

◎ソース

import java.awt.*;
import java.awt.event.*;

public class fst extends Frame implements Runnable{
  public static final void main(final String[] args){
    //ウィンドウ生成
    Frame app=new Frame();
    //タイトル設定
    app.setTitle("Title");
    //ウィンドウサイズ設定(タイトルや枠も含んだサイズ)
    app.setSize(240, 240);
    //キャンバスを配置
    fstCanvas cvs=new fstCanvas();
    app.add(cvs);
    //スレッド生成
    fst fst2 = new fst();
    Thread th = new Thread(fst2);
    th.start();
    //ウィンドウ表示
    app.setVisible(true);
    //無限ループ
    while (true){
      cvs.repaint();
    }
  }

  static class fstCanvas extends Canvas{
    public void paint(Graphics g){
      g.drawString("Hello World", 16, 16);
    }
  }

  public void run(){
    while (true){
      System.out.println("スレッド処理中");
    }
  }
}

これをビルドして走らせると,ウィンドウ上の文字は点滅し,DOS窓に文字が流れます
このように同時に2つの処理を平行して行わせる為の技術がスレッドです


TOPプログラマ専用Javaアプリケーション