2002 -1208 ver 0.93 発行待ち草稿 ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃.&&&& **** %%%%.  JavaScript&Javaで目指そう!基本情報技術者試験  ┃ ┃&&&&&&******%%%%%%  http://www.yscon.co.jp/j/java/jmaga/      ┃ ┃'&┃&''*┃*''%┃%'      (C)2002 斎藤末広 jmaga@yscon.co.jp  ┃ ┗━┻━━┻━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 前回の発行部数 ○○部(magmag 部,Pubzine 部, ) ★解除・登録 :http://www2.odn.ne.jp/~egu33/jmaga/java-maga.html ★バンクナンバー :http://www.yscon.co.jp/j/java/jmaga/ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓  第32号 2002/12/xx  基本テクニック編 スレッド ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛  プログラムを作成する上での注意事項:  Windows98SE, SDK(JDK) 1.4.0,IE 5.5 を前提としています。  拡張子を表示するに設定してください。 ========================================================================= 交換広告(交換希望の方は,jmaga@yscon.co.jpまで) ----☆PR☆--------------------------------------------------------------           コンピュータ関係の資格を取りたい方へ              毎日届く,宿題メールの勉強仲間に入りませんか? .&&&& **** %%%%. &&&&&&******%%%%%% 登録: http://backno.mag2.com/reader/Back?id=0000001414 '&┃&''*┃*''%┃%' 発行元:末広ページ http://3721p.com --------------------------------------------------------------☆PR☆---- ======================================================================== ▼ スレッド  時刻を表示続ける、また、絵を動かすなど,ある動作を続けるプログラムを作 成するときは,スレッド管理というテクニックを利用します。  この号では,スレッドの使い方を勉強します。 ------------------------------------------------------------------------ ▼ 一度きりの仕事  まず,Java の一番基本のプログラム,Hello に登場してもらいましょう。 例 j32-01 xHello.java "Hello"を表示 ソース http://www.yscon.co.jp/j/java/jmaga/j32/xHello.java 1: /* 2: Java 基本プログラム アプリケーション "Hello"を表示 3: */ 4: public class xHello { 5: public static void main(String[] xargs){ 6: System.out.println("Hello"); 7: } 8: }  DOSのプロンプト画面で,  javac xHello.java  java xHello  とやると,"Hello"と表示されます。  このプログラムは実行すると,表示して終わります。  このプログラムをある程度,続けるように修正してみましょう。 ------------------------------------------------------------------------ ▼ 1000 回繰り返す  "Hello"を 1000 回繰り返すプログラムを作成してみましょう。"Hello"だけを 1000 回表示しても,動作しているかどうかわかりませんので,時刻を表示して みます。 例 j32-01 xSmpThread00.java スレッド管理なしの単純な時刻表示 ソース http://www.yscon.co.jp/j/java/jmaga/j32/xSmpThread00.java 1: /* 2: スレッド管理なしの単純な時刻表示 3: */ 4: 5: import java.util.Date; // 日付・時刻関係 6: 7: public class xSmpThread00 { 8: 9: public static void main(String[] xargs){ 10: Date xd; 11: for (int i = 0; i<1000; i++){ 12: xd = new Date(); 13: System.out.println("Hello 時刻:" + xd); 14: } 15: } 16: } ------------------------------------------------------------------------ ▼ 休眠(sleep)状態を作る。  目的が,"Hello"といっしょに時刻を表示するプログラムであれば,1秒単位で 時刻を教えてくれたら,十分です。そのように修正することにしましょう。  1 秒ごとに動作して,それ以外はプログラムを休眠状態にします。休眠状態に するために,sleep()というメソッドを使用します。sleep()メソッドは,Thread (スレッド)クラスのメソッドです。  Thread(スレッド)のもともとの英語は,糸を指します。コンピュータ用語とし ては,ひとつのプログラム内の動作している単位を指します。また,メーリング リストなどで,話題の流れ(筋)をスレッドといいます。ひとつのプログラムの中 で,同時に3つの部分が動作していたら「このプログラムでは,3つのスレッド が動作している」といい,メーリングリストで,3つの話題のメールがつぎつぎ と投稿されていたら,「3つの話題のスレッドの流れている」といいます。  Java の Threadクラスは,スレッドの動作を管理するためのクラスです。スレッ ドの状態を,ソフトウェア工学上では,  ready 実行可能状態  run 実行状態  wait 実行待ち状態 と呼んでます。Java では,この3つの状態のうち,run(実行状態)とready(実行 可能状態)の行き来を,Javaプログラム内では管理せず,JVM(Java仮想エンジン) に任せます。Javaプログラムでは,基本的に,実行状態(run=ready)と実行待ち状 態(wait)の2状態でスレッドが管理されます。  スレッドのsleep(休眠)は,wait(実行待ち状態)のひとつです。一秒ごとに動作 するプログラムをこの sleep() メソッドを利用して作ります。 ------------------------------------------------------------------------ ▼ スレッドを利用した,Java プログラム 1 秒単位で時刻を表示するプログラムは,Thread(スレッド)を利用して次の ように作ることができます。  このプログラムは,永久に動作するように作成してあります。終了するには Ctrl+C(コントロールキーを押しながら, c のキー)を押してください) 例 j32-02 xSmpThread01.java スレッドを利用したアプリケーション 時刻表示 ソース http://www.yscon.co.jp/j/java/jmaga/j32/xSmpThread01.java 1: /* 2: スレッドを利用したアプリケーション 時刻表示 3: 注意 永久に動作するため,終了は,Ctrl+C 4: */ 5: 6: import java.util.Date; // 日付・時刻関係 7: 8: public class xSmpThread01 implements Runnable { 9: 10: Date xdNow; 11: 12: public static void main(String[] xargs){ 13: xSmpThread01 xprog = new xSmpThread01(); 14: Thread xth = new Thread(xprog); // スレッド生成 15: xth.start(); // スレッド開始(ready状態へ) 16: } 17: 18: // Runnable対象部分 スレッド実行の時間管理 19: public void run(){ 20: while(true){ // 実行を継続する条件 21: xrepeatWork(); // 繰返し仕事 22: try { //「指定ミリ秒の間,眠る」をモニタ 23: Thread.sleep(1000); // 1秒休み 24: } 25: catch(InterruptedException e){ 26: } 27: } 28: } 29: 30: // 繰返し仕事 31: public void xrepeatWork(){ 32: xdNow = new Date(); 33: System.out.println("今の時刻は " + xdNow); 34: } 35: }  プログラムの説明をします。 8: public class xSmpThread01 implements Runnable { は,この xSmpThread01 クラスというプログラムを,スレッド管理すると宣言し てます。implements Runnable というのがその部分です。これを書くと,このプ ログラムに対してスレッド管理が可能になります。  Runnable というのはクラスとよく似ていて,Jマガでは,「クラスもどき」と 呼んでいる,インターフェースと呼ばれるものです。インターフェースについては 別の号で解説予定です。 12: public static void main(String[] xargs){ 13: xSmpThread01 xprog = new xSmpThread01(); 14: Thread xth = new Thread(xprog); // スレッド生成 15: xth.start(); // スレッド開始(ready状態へ) 16: }  Java アプリケーションでは,最初に,main メソッドが実行されます。ここで, xSmpThread01 クラスから,xprog というインスタンスを生成しています。スレッド 管理をするために,本体自らをスレッド管理の対象にするのではなくて,分身(イ ンスタンス)を生成し,それを管理しようとしています。 13: xSmpThread01 xprog = new xSmpThread01();  ここで,インスタンス xprog を管理するスレッドの名前を xth としています。 15: xth.start(); // スレッド開始(ready状態へ)  で,xprog インスタンスを実行管理するスレッド(xth)が実行状態(ready=run)に されます。xth.start()で実行されるのは,run() メソッドです。これは,Thread クラスとRunnableインターフェースとのすでに,約束として,決まっています。 18: // Runnable対象部分 スレッド実行の時間管理 19: public void run(){ 20: while(true){ // 実行を継続する条件 21: xrepeatWork(); // 繰返し仕事 22: try { //「指定ミリ秒の間,眠る」をモニタ 23: Thread.sleep(1000); // 1秒休み 24: } 25: catch(InterruptedException e){ 26: } 27: } 28: }  xth.start()で,run()の実行が開始されます。ここでは,while(ture)で,無限 に実行を続ける,さらに,そこで,xrepeatWork()が実行され,  次の 22: try { //「指定ミリ秒の間,眠る」をモニタ 23: Thread.sleep(1000); // 1秒休み 24: } 25: catch(InterruptedException e){ 26: } 実行されます。「try { } cathch { }」 を try 文と言います。この中にある, Thread.sleep(1000)は,このスレッドを1000ミリ秒(=1秒)休眠状態にするという 意味です。  try文は,何か動作をしてそれをモニターするいう命令文です。ここの try文は, 休眠状態をモニターしています。try 文の詳細は,別の号で扱います。  この無限ループ内で,1秒毎に実行,正確には,1秒眠るごとに実行される, xrepeatWork()をみましょう。  xrepeatWork()をしたら,1000ミリ秒休眠して,起きたら,xpreatWork()をま たやり,繰り返すを指示しています。  xrepeatWork()をみてみましょう。 30: // 繰返し仕事 31: public void xrepeatWork(){ 32: xdNow = new Date(); 33: System.out.println("今の時刻は " + xdNow); 34: }  この部分は,20 行目からの while(ture)の中に直接書いても構いません。しか し,わざわざ,xrepeatWork()と別のメソッドとして独立ささせたのは,実行のタ イミングを管理する,run()と実際の仕事である時刻の表示を分離するためです。 このように分離しておくと,時間と仕事を区別できます。 ------------------------------------------------------------------------ ▼ アプレットでスレッドを利用する  Javaアプリケーションでスレッドを利用するプログラムを説明しました。ここ でほぼ同様の仕事をするアプレットを作成してみて,アプレットでのスレッド管 理をみてみましょう。 例 j32-03 xSmpThread02.java スレッドを利用したアプレット 時刻表示 ソース http://www.yscon.co.jp/j/java/jmaga/j32/xSmpThread02.java 実行  http://www.yscon.co.jp/j/java/jmaga/j32/xSmpThread02.htm 1: /* 2: スレッドを利用したアプレット 時刻表示 3: */ 4: import java.applet.Applet; 5: import java.awt.Graphics; 6: import java.util.Date; // 日付・時刻関係 7: 8: public class xSmpThread02 extends Applet implements Runnable { 9: 10: Date xdNow; 11: Thread xth; // スレッドにインスタンス名を付ける。 12: 13: public void start(){ 14: xth = new Thread(this); // スレッド生成 15: xth.start(); // スレッド開始(ready状態へ) 16: } 17: 18: // Runnable対象部分 スレッド実行の時間管理 19: public void run(){ 20: while(true){ // 実行を継続する条件 21: repaint(); // 繰返し仕事(画面書き換え) 22: try { //「指定ミリ秒の間,眠る」をモニタ 23: Thread.sleep(1000); // 1 秒休み 24: } 25: catch(InterruptedException xe){ 26: } 27: } 28: } 29: 30: // 画面に表示(繰返し仕事) 31: public void paint(Graphics xg){ 32: xdNow = new Date(); 33: xg.drawString("今の時刻は " + xdNow, 30, 30); 34: } 35: }  xSmpThread01 と xSmpThread02 のスレッド利用の違うところを確認しましょう。 違っているところは,次の2点です。  (1)  スレッド管理の対象  スレッド管理の対象のところは sSmpTread01(アプリケーション) xSmpThread01 xprog = new xSmpThread01(); Thread xth = new Thread(xprog); に比べて, sSmpThread02(アプレット) xth = new Thread(this);  xSmpThread01 は,そのクラス(プログラム)のインスタンスを生成して,それを スレッド管理の対象にしました。  xSmpThread02 は,いきなり,自分自身(this) をスレッド管理の対象にしてい ます。  (2) ひとコマの動作の定義  (1)の「スレッド管理の対象」は,JavaアプリケーションとJavaアプレットでの スレッド管理の大きな違いです。しかし,こちらの「ひとコマの動作の定義」は, 作成するプログラムによって,自由に書くことができます。 ------------------------------------------------------------------------ ▼ 次号の予定  この号では,スレッド管理のもっとも簡単な例を扱いました。  次号は,スレッドを利用した簡単なゲームを扱います。 ------------------------------------------------------------------------ ▼ 著作権について  このメールマガジンで公開しているプログラムソースは,著作権を当方スタッ フが所有しますが,商用を含めて,再利用,改変,発表を制限しません。  本文に関しては,斎藤末広が著作権を所有します。再利用に関しては,承諾を 必要とします。 ------------------------------------------------------------------------ ▼アンケート(以下を返信してください)  この号のJマガに対するご意見をお待ちしています。ぜひ,ご返信下さい。 内容のレベルは 1 難しいのでもっと簡単にしてほしい 2 ちょうどよい 3 もっと難しくてもよい その他ご要望