Nanashi-soft○プログラマ専用○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つの処理を平行して行わせる為の技術がスレッドです