スレッドと時計

  1. 日付と時計
    スレッドを利用して1秒間隔で日付と時刻を表示します。

  2. スレッド

    1. スレッドとは
       スレッドは独立した実行単位です。プログラムは一つのスレッドで、メインスレッドと呼びます。メインスレッドは別のスレッドを生成することができます。生成されたスレッドは、メインスレッドと並列に実行されます。システムは実行可能なスレッドを一定時間間隔で順に実行していきます

    2. スレッドの役割
      時計におけるスレッドの役割は、一定時間間隔でメインスレッドの paint() を呼び出すことです。要求を出すと、1秒間「寝て待つ」ために、
       sleep(<時間>) 
      を実行します。sleep()を実行したスレッドは「お休み」状態になり、指定時間が経過すると、「目覚めて」また、 paint() を呼び出します。

  3. 手法
    1. 日付と時刻情報の取得
      日付と時刻情報の取得はDateクラスを利用します。
       Date w_date;
       w_date = new Date();
      で、w_dateに日付と時刻情報が取得できます。Dateを利用するには、
       import java.util.*;
      が必要です。
       日付の表示は、w_date.toString() で文字列に変換します。
       g.drawString(w_date.toString(), 10, 30);

    2. スレッドのプログラム
      スレッドを利用するには、アプレットの宣言で、

       public class digwatch extends Applet implements Runnable

      とimplementsで Runnable インターフェースを組み込みます。

      次に、スレッドクラスのオブジェクト w_clock を作成し、スレッド起動します。
       Thread w_clock = null;
       w_clock = new Thread(this);
       w_clock.start();

      スレッドは起動すると run メソッドを並列に実行します。

    3. プログラムの構成

      1. init():初期設定
        アプレットでは最初に初期化用関数 init() を呼び出します。このメソッドで、スレッドを起動します。
         public void init() {
                 //スレッドの起動
                 w_clock = new Thread(this);
                 w_clock.start();
          }

      2. paint():表示
        アプレットの画面に表示を行う関数で、自動生成されませんから、組み込みます。
        ここでは、時刻情報を取得し、表示します。まず、背景をdarkGrayに設定し、
         g.fillRect(0,0,240,60)
        で塗りつぶしておきます。
         次に、表示の文字の色をgreenとし、g.drawString(w_date.toString(), 10, 30); で、時刻の文字w_dateを(10,30)の位置から表示します。

      3. run()
        スレッドの処理内容は run() メソッド で指定します。
         run()ではまず、repaint()で再描画を要求し、sleep(1000)で1000m秒休止します。休止後再び、repaint() で再描画を要求します。これで、時計の表示が更新されます。
         Thread.sleep(1000); の外側のtryとcatchは、エラー処理を行う仕掛けです。ここでは、特にエラー処理をしていませんが、一部のメソッドではこのエラー処理がないと、「try節がありません」とコンパイラーが注意をします。

        public void run() {
           while (true) {
                 //     再描画
                 repaint();
                 try
                 {
                  Thread.sleep(1000);
                  }
                  catch(Exception e) {}
                 }
                }

  4. プログラム
    1. ソース
      import java.awt.*;
      import java.applet.*;
      import java.util.*;
      
      public class watch extends Applet implements Runnable
      {
      
        Thread w_clock = null;
        Date w_date;
      
        
        /**アプレットの初期化*/
        public void init() {
      
               //スレッドの起動
               w_clock = new Thread(this);
               w_clock.start();
        }
      
      
        public void paint(Graphics g) {
              g.setColor(Color.darkGray);
              g.fillRect(0,0,240,60); //背景を塗る
              g.setColor(Color.green);//      緑色でテキストの色を設定
              w_date = new Date();
              g.drawString(w_date.toString(), 10, 30);
        }
      
        public void run() {
         while (true) {
               //     再描画
               repaint();
               try
               {
                Thread.sleep(1000);
                }
                catch(Exception e) {}
               }
              }
      }

  5. 実行
    1秒間隔で、Date情報を取得し表示を行います。




トップに戻る