┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  合格☆Java                   ┃ ┃&&&&&&******%%%%%%  http://www.yscon.co.jp/j/mag          ┃ ┃'&┃&''*┃*''%┃%'             (C)2006 斎藤末広    ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第2号 2006/04/09  スレッド Thread と Runnable ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━PR━   ┌──────────────────────────────┐   │{2006年春期合格ノート問題編}+{午後試験対策(高度)} │   └──────────────────────────────┘   今回は、私、斎藤がプロデュースした午後試験対策も同時配布しますよ!      さあ、試験勉強なら今すぐダウンロードしてください。 -----------------------------------------------------------------------  ⇒ https://www.techno-brain.co.jp/campaign/06_sp_gokaku/smm/ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 目次 ▼「合格☆Java」とは ▼ スレッドはすでにあった main スレッド ▼ スレッドプログラムの3つのポイント ▼ いかにもマルチスレッドのプログラム 決まった時間停止 sleepメソッド ▼ Threadクラスを拡張して,マルチスレッド ========================================================================= ▼「合格☆Java」とは  「合格☆Java」は,基本情報処理技術者試験のJavaにターゲットをあわせてた メルマガです。  「合格☆Java」は,無料版と,有料版を発行します。今,みなさんが,ご覧の ものは,無料版です。無料版では,Java文法の解説を中心に行います。有料版は, 現在,準備中です。有料版は,実際の試験問題の解説を扱います。  「合格☆Java」は,  「JavaScript&Javaで目指そう!基本情報技術者試験」(通称Jマガ)  http://www.yscon.co.jp/j/java/jmaga/  の姉妹紙です。発行済みのJマガでかなりの文法事項を説明してありますので あわせてご利用下さい。 ------------------------------------------------------------------------ ▼ スレッドとは  並行処理をするマルチタスクをさらい効率よくしたものが,マルチスレッドで す。  Windows95から,パソコンでは,このマルチスレッドが完全に動作するように なりました。今のパソコンではあたりまえの機能になってます。  マルチタスクとは,OS 上で複数のプログラムを見た目,同時実行しているよう に見せる仕組みです。マルチスレッドとは,その実行しているプログラム内で, さらに並行処理をしているように見せる仕組みです。  スレッドを利用したプログラムは,ややこしいです。しかし,Java は,これを 言語レベルで実現しているため,たくさんのことを勉強せずに,簡単に書くこと ができます。(といっても難しいとはいえますが)  この号では,Java で,スレッドを実現するときに利用する,Thread クラスと Runnable インターフェースを説明します。 ------------------------------------------------------------------------ ▼ スレッドをすでにあった  まず,おなじみの,"Hello"プログラムです。 1: /* 2: Java 基本プログラム "Hello"を表示 3: */ 4: public class xHello { 5: public static void main(String[] xargs){ 6: System.out.println("Hello"); 7: } 8: }  通常,わざわざ考えませんが,ここでは,main が実行されて,終了します。 ここでも,一つのスレッドがあります。つまり,このクラスがコマンドライン プロンプト画面 ┏------------------------------------------------------------┓ J:\jsmp\gj002>java xHello ┗------------------------------------------------------------┛ と実行を指示されたときに,xHello の main を動作さえるというスレッドが あります。これを main スレッドといいます。  このプログラムの場合,実行は,main() ,println() と進みます。この 進む道筋を,スレッドといいます。スレッド(=thread)の本来の英語の意味は,糸 で,じゅず玉などを通す太めの糸を指します。プログラムの中を貫くために通す 糸ということで,スレッドです。 ------------------------------------------------------------------------ ▼ もっとも簡単なマルチスレッド  "Hello"プログラムは,main スレッドしかない,シングルスレッドのプログラム です。これに,別のスレッドを付け加えて,マルチスレッドにしましょう。  デェイとスキッパーに登場してもらいます。 1: /* 2: マルチスレッドの単純な例 3: */ 4: 5: import java.util.Date; 6: 7: class xDate extends Date implements Runnable{ 8: public void run(){ 9: System.out.println("おいらはデェイだ。呼んだのはスキッパーだ。"); 10: } 11: } 12: 13: public class xThre01 { 14: 15: public static void main(String[] xargs){ 16: 17: Runnable xdate = new xDate(); 18: Thread xthkiper = new Thread(xdate); 19: 20: xthkiper.start(); 21: System.out.println("Hello"); 22: } 23: } 実行すると, プロンプト画面 ┏------------------------------------------------------------┓ J:\jsmp\gj002>java xThre01 Hello おいらはデェイだ。呼んだのはスキッパーだ。 ┗------------------------------------------------------------┛ となります。 ------------------------------------------------------------------------ ▼ スレッドプログラムの3つのポイント  スレッドプログラムのポイントは,  1 Runnableインターフェース実装するクラスのインスタンスを作る  2 Thread インスタンスを作り  3 start() で実行を開始 プログラムでは 17: Runnable xdate = new xDate(); 18: Thread xthkiper = new Thread(xdate); 19: 20: xthkiper.start(); にあたります。  Thread クラスのインスタンス xthkiper は,new されるときに自分の担当の Runnable.runメソッド,xdate.run() を覚えます。  このスレッドの動作は,xthkiper.start() で開始します。xthikper.start()と 指示されると,xthkiper は,xdate.run()が動作するために準備をして,xdate.run() を実行します。xdate が,run()を終えたら,自動的に,xthiker も仕事が終わりです。 補足 17: Runnable xdate = new xDate(); は,xDate xdate = new xDate(); としても動作します。しかし,必要でないもの は公開しないという原則で,Runnable xdate = new xDate(); の方がいいプログラム になります。 ------------------------------------------------------------------------ ▼ いかにもマルチスレッドのプログラム 決まった時間停止 sleepメソッド  上の例では,マルチでスレッドが動作しているのが分かりにくいでしょう。 動作をもう少し,ゆっくり目,長めにします。 1: /* 2: マルチスレッドをゆっくり目,長めの単純な例 3: Thread.sleep() 4: */ 5: 6: import java.util.Date; 7: 8: class xDate extends Date implements Runnable{ 9: public void run(){ 10: for(int i=0; i<10; i++){ 11: 12: try { 13: Thread.sleep(500); 14: }catch(Exception xe){ } 15: 16: System.out.println(" おいらはデェイだ。"); 17: } 18: } 19: } 20: 21: public class xThre02 { 22: 23: public static void main(String[] xargs){ 24: 25: xDate xdate = new xDate(); 26: Thread xthkiper = new Thread(xdate); 27: 28: xthkiper.start(); 29: for(int i=0; i<5; i++){ 30: 31: try { 32: Thread.sleep(500); 33: }catch(Exception xe){ } 34: 35: System.out.println("Hello"); 36: } 37: } 38: } 実行すると,ゆっくりと動作しているのが分かると思います。表示は, プロンプト画面 ┏------------------------------------------------------------┓ J:\jsmp\gj002>java xThre02 Hello  おいらはデェイだ。 Hello  おいらはデェイだ。 Hello  おいらはデェイだ。  おいらはデェイだ。 Hello Hello  おいらはデェイだ。  おいらはデェイだ。  おいらはデェイだ。  おいらはデェイだ。  おいらはデェイだ。  おいらはデェイだ。 ┗------------------------------------------------------------┛ となります。  xthkiper が動作を管理している方,つまり,xdate の方に,for文で10回ループ, 休みをそれぞれ,500ミリ秒としました。 9: public void run(){ 10: for(int i=0; i<10; i++){ 11: 12: try { 13: Thread.sleep(500); 14: }catch(Exception xe){ } 15: 16: System.out.println("おいらはデェイだ。"); 17: } 18: } です。 同様に,mainスレッドの方では,for 文で,5回ループ,休みをそれぞれ,300ミリ秒 としました。 29: for(int i=0; i<5; i++){ 30: 31: try { 32: Thread.sleep(500); 33: }catch(Exception xe){ } 34: 35: System.out.println("Hello"); 36: } スレッドを休ませるには, 31: try { 32: Thread.sleep(500); 33: }catch(Exception xe){ } のように書きます。Thread クラスのクラスメソッド sleep()を使います。数字は ミリ秒単位です。try/catch でサンドイッチしているのは,sleep()メソッドが, コンパイラによて,例外処理を書いてあるかどうかをチェックされる例外チェック メソッドだからです。このサンプルでは,{ } と何もしていません。 ------------------------------------------------------------------------ ▼ Threadクラスを拡張して,マルチスレッド  Thre01.java では,Runnableインターフェースを使いましたが,これを使わず に,Thread を拡張して,マルチスレッドを実現することもできます。 xThre01.java を変形して,xThrad03.java を作成します。 1: /* 2: マルチスレッドの単純な例 Threadクラスを拡張 3: */ 4: 5: import java.util.Date; 6: 7: class xThread extends Thread{ 8: public void run(){ 9: System.out.println("スキッパーよ。私に直接仕事をさせる気?"); 10: } 11: } 12: 13: public class xThre03 { 14: 15: public static void main(String[] xargs){ 16: 17: Thread xthkiper = new xThread(); 18: 19: xthkiper.start(); 20: System.out.println("Hello"); 21: } 22: } 実行すると プロンプト画面 ┏------------------------------------------------------------┓ J:\jsmp\gj002>java xThre03 Hello スキッパーよ。私に直接仕事をさせる気? ┗------------------------------------------------------------┛ となります。 7: class xThread extends Thread{ 8: public void run(){ 9: System.out.println("スキッパーよ。私に直接仕事をさせる気?"); 10: } 11: } と,Thread クラスを拡張して,run() を上書きします。実は,Threadクラスは, Runnableインターフェースを中身が空で,実装していました。ここで,改めて, Runnableインターフェースのrun()メソッドを実装します。 17: Thread xthkiper = new xThread();  xThre01.java では,この new のときは,スレッドのターゲットを渡しました。 17: Runnable xdate = new xDate(); 18: Thread xthkiper = new Thread(xdate); です。  xThre03.java では,スレッドのターゲットのrun()は,すでに,自分自身で 持っているので,new するときは,new xThread() だけです。 ------------------------------------------------------------------------ ▼ Runnable か Thread の拡張か?  マルチスレッドを実現するときに,Runnable を使うか,Thread の拡張を使う かは,  Runnableを使うとき   特定のクラスをマルチスレッドの対象としたいとき  Threadを拡張するとき   マルチタスク自体のシステムを拡張したいとき とするのがいいのではないでしょうか。 ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開している,プログラムソースは,著作権を当方スタッ フが所有しますが,プログラムソースの利用は,原則,商用を含めて,再利用, 改変,発表を制限しません。どんどんご利用下さい。  質問コーナのプログラムソースは,著作権に問題がある場合があるかもしれま せん。原則を適用しません。再利用の許可をしません。  画像や音などの素材は,それぞれ著作権があります。著作者に承諾なしに再利 用はできません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。お問い合わせ下さい。 ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号の意見をお待ちしています。ぜひ,ご返信下さい。 この号の内容 1 良かった 2 普通 3 良くなかった コメント,リクエスト,質問もお待ちしています。遠慮せずにどうぞ。