スレッドの一時停止

広告

アニメーションなどを行う場合、あまり高速に画面を切り替えたくないなど、タイミングを取りたい場合があります。わざと処理時間がかかるような無駄な処理を追加することもできますが、Threadクラスで用意されているsleepメソッドを使うことで、指定した時間だけスレッドを一時停止させることが出来ます。

現在実行中のスレッドを、指定されたミリ秒数の間、スリープ (一時的に実行を
停止) させます。スレッドはモニターの所有権を失いません。 

パラメータ:
  millis - ミリ秒単位のスリープ時間の長さ 
例外: 
  InterruptedException - 別のスレッドが現在のスレッドに割り込んだ場合。
    この例外がスローされると、現在のスレッドの割り込みステータスはクリ
    アされる

引数で指定したミリ秒だけスレッドを一時停止させます。このメソッドはThreadクラスのstaticメソッドとして定義されていますので、例えば1秒停止させたい場合には下記のように記述して使う事ができます。

try{
  Thread.sleep(1000);
}catch (InterruptedException e){
}

※例外が発生するため、try文の記述が必要です。

サンプルプログラム

では前に作成した円をランダムに描くアプレットに対して、円を一度描くことで0.5秒待機するようにしてみましょう。

ThreadTest5.java

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Color;

/*
<applet code="ThreadTest5.class" codebase="class" width="150" height="150">
</applet>
*/

public class ThreadTest5 extends Applet implements Runnable{
  Thread thread = null;
  int x, y;
  Color col;

  public void init(){
    x = 10;
    y = 10;
    col = new Color(255, 0 ,0);

    thread = new Thread(this);
    thread.start();
  }

  public void update(Graphics g){
    paint(g);
  }

  public void paint(Graphics g){
    g.setColor(col);
    g.drawOval(x, y, 50, 50);
  }

  public void run(){
    while(true){
      x = (int)(Math.random() * 100);
      y = (int)(Math.random() * 100);

      int red = (int)(Math.random() * 255);
      int green = (int)(Math.random() * 255);
      int blue = (int)(Math.random() * 255);
      col = new Color(red, green, blue);

      repaint();

      /* 500ミリ秒待機する */
      try{
        Thread.sleep(500);
      }catch (InterruptedException e){
      }
    }
  }
}

実行結果は今までと同じですが、円が描かれるのがかなりゆっくりになったと思います。

下記で実際に試して頂くことができます。

ThreadTest5.html

( Written by Tatsuo Ikura )