初心者向けのJava講座です。一緒にJavaを勉強しませんか?
はじめてのJava入門初心者向けのJava講座 |
スレッドの作成(Threadクラスを拡張)
スレッドを作成するには二つの方法があります。
まずはThreadクラスを拡張する方法を見ていきます。
まずはThreadクラスを継承する独自のクラスを定義します。
Threadクラスにはrunメソッドが定義されています。
Threadクラスを拡張したクラスにrunメソッドをオーバーライドしなければいけません。
スレッドが実行されたときにそのrunメソッドの処理が呼び出されます。
スレッドを実行するにはThreadクラスのstartメソッドを呼び出さなければいけません。
startメソッドを呼び出すと、スレッドで使用するメモリの準備が行われいつでも実行可能状態になります。実行可能状態のスレッドが必ずしも実行中でないことに注意しましょう。
実行可能状態のスレッドが実行する条件が整うと、スレッドのrunメソッドが呼び出されスレッドが実行されます。
基本的なスレッドの作成方法
class ThreadSample extends Thread{ public void run(){ スレッドの処理内容 } } class SampleTest{ public static void main(String args[]){ ThreadSample t = new ThreadSample(); //startメソッドでスレッドの処理内容を呼び出し t.start(); } }このように記述します。
まず、Threadクラスを継承します。また必ずThreadクラスのrun()メソッドをオーバーライドしなければいけません。
またThreadクラスのrun()メソッドにはpublicがつけられています。したがってオーバーライドのルールに 基づいてサブクラスでもpublicを付けなければいけません。
そのrun()メソッド内に処理内容を記述しスレッドを呼び出すのがstrat()メソッドになります。
では実際にスレッドを使ったプログラムを見ていきます。
サンプルプログラム(Sample83.java)
class ThreadSample83 extends Thread{
//スレッドの処理内容を記述 public void run(){ for(int i = 0; i < 5; i++){ System.out.println( i + "回目のスレッドの処理です。"); } } } class Sample83{ public static void main(String args[]){ //Threadクラスから拡張したThreadSample83クラスのオブジェクト生成 ThreadSample83 t = new ThreadSample83(); //スレッドを起動 t.start();
for(int y = 0; y < 5; y++){ System.out.println(y + "回目のmainの処理です"); } } }
プログラムをコピーする場合すべて選択をクリックしてください。
Sponsored link
コンパイル・実行します。
このようになりました。
ここで注意しなければいけないことがあります。今回あえて実行を2回試みました。
実行結果を見てもわかるように実行結果の内容が異なっています。つまり2つの処理が同時に行われているからです。
また2つの処理は、どちらがどのような順番で行われるか決まっていません。
つまり、新しいスレッドが起動することにより処理の流れが2つになるわけです。したがって、お使いの環境などにより実行結果も変わるわけです。
また、新しく起動したスレッドはrun()メソッドが終了したところで消滅します。
また、Threadクラスのrun()メソッドは修飾子にpublicが付加されています。
したがってThreadクラスからオーバーライドしたサブクラスのrun()メソッドもpublicにしてやる必要があります。
一度起動したスレッドを再度呼び出せない
サンプルプログラム(Sample83_1.java)
class ThreadSample83_1 extends Thread{
//スレッドの処理内容を記述 public void run(){ for(int i = 0; i < 5; i++){ System.out.println( i + "回目のスレッドの処理です。"); } } } class Sample83_1{ public static void main(String args[]){ for(int y = 0; y < 5; y++){ System.out.println(y + "回目のmainの処理です"); } //Threadクラスから拡張したThreadSample83_1クラスのオブジェクト生成 ThreadSample83_1 t = new ThreadSample83_1(); //スレッドを起動 t.start(); t.start();
} }
プログラムをコピーする場合すべて選択をクリックしてください。
Sponsored link
コンパイル・実行してみます。
start()メソッドで同じスレッドを複数呼び出すことができません。
もし呼び出そうとしたらコンパイルはできるのですが、IllegalThreadStateException例外が送出されます。
もしまた呼び出したいときは新たにオブジェクトを生成しなければいけません。
サンプルプログラム(Sample83_2.java)
class ThreadSample83_2 extends Thread{ String nam; public ThreadSample83_2(String str){ nam = str; }
//スレッドの処理内容を記述 public void run(){ for(int i = 0; i < 5; i++){ System.out.println(nam); System.out.println( i + "回目のスレッドの処理です。"); } } } class Sample83_2{ public static void main(String args[]){ for(int y = 0; y < 5; y++){ System.out.println(y + "回目のmainの処理です"); } //Threadクラスから拡張したThreadSample83_2クラスのオブジェクト生成 ThreadSample83_2 t = new ThreadSample83_2("@"); ThreadSample83_2 t1 = new ThreadSample83_2("A"); //スレッドを起動 t.start(); t1.start();
} }
プログラムをコピーする場合すべて選択をクリックしてください。
Sponsored link
コンパイル・実行してみます。
このように複数のスレッドが呼び出すことができます。