icon
icon

JavaのTimerクラスの使い方を現役エンジニアが解説【初心者向け】

初心者向けにJavaのTimerクラスの使い方について解説しています。これは指定の処理を一定の間隔で定期的に行うことができるクラスです。設定の手順と処理の流れについてサンプルコードで確認しましょう。

テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日  調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,000名  調査手法:インターネット調査

JavaのTimerクラスの使い方について解説します。実際にプログラムを書いて説明しているので、ぜひ理解しておきましょう。

 

そもそもJavaについてよく分からないという方は、Javaとは何なのか解説した記事を読むとさらに理解が深まります。
 

なお本記事は、TechAcademyのオンラインブートキャンプJava講座の内容をもとに作成しています。

 

 

田島悠介

今回は、Javaに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

Timerクラスの使い方について詳しく説明していくね!

大石ゆかり

お願いします!

 

Timerクラスとは

Timerクラスは一定間隔で定期的な処理を行うためのクラスです。例えば1秒ごとに時刻を表示したい等の場合に利用できます。

 

Timerクラスで定期的な処理を行う方法

java.util.Timerクラスの

public void scheduleAtFixedRate(TimerTask task, long delay, long period) メソッド、または
public void schedule(TimerTask task, long delay, long period) メソッドを使います。

第一引数として実行したいタスクを指定します。TimerTaskクラスを継承したクラスを作成し、runメソッドの中に実行したい処理を実装します。

第二引数として、開始時刻をミリ秒で指定します。

第三引数は実行間隔で、同じくミリ秒で指定します。

最初のタスクの実行開始時刻を基準に、次のタスク開始時刻を設定するのに対し、scheduleメソッドは直前のタスクの開始時刻を基準に、次のタスク開始時刻を設定します。

その為なんらかの影響でタスクに遅延が発生した場合、遅延後のタスク開始時間を元に次のタスクが実行されます。つまり遅延が発生するとそれ以降の処理がすべて遅延するということになります。

実装方法としてはTimerTaskクラスを継承したクラスを作成し、runメソッドを実装します。Timerクラスのインスタンスを作成し、scheduleAtFixedRateおよびscheduleメソッドを実行する際に継承クラスのインスタンスと、開始時刻、実行間隔を指定するという流れです。

 

[PR] 未経験からWebエンジニアを目指す方法とは

実際に書いてみよう

まず、タスククラスです。

import java.util.Date;
import java.util.TimerTask;

public class SampleTask extends TimerTask {

  // 実行回数
  static int i = 1;

  public void run() {
    try {

      System.out.println("-----------------------------------------");
      System.out.println(i + "回目タスク開始" + new Date());

      //3秒間停止する
      Thread.sleep(3000);

      System.out.println(i + "回目タスク終了" + new Date());

      i = i + 1;

    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

タスク開始直後に現在時刻を表示し、タスク中でスレッドを3秒停止後、再度現在時刻を表示して終了します。

次に実行クラスです。

import java.util.Date;
import java.util.Timer;

public class Sample {

  public static void main(String[] args) {

    // Timerクラスのオブジェクトを作成
    Timer time = new Timer();

    System.out.println("実行開始" + new Date());

    // 一定間隔で処理を開始する
    // SampleTaskを、3秒後に、5秒間隔で実行する
    time.scheduleAtFixedRate(new SampleTask(), 3000, 5000);
  }
}

5秒間隔でタスクを実行します。
実行結果は

実行開始Thu May 30 22:07:28 JST 2019
-----------------------------------------
1回目タスク開始Thu May 30 22:07:31 JST 2019
1回目タスク終了Thu May 30 22:07:34 JST 2019
-----------------------------------------
2回目タスク開始Thu May 30 22:07:36 JST 2019
2回目タスク終了Thu May 30 22:07:39 JST 2019
-----------------------------------------
3回目タスク開始Thu May 30 22:07:41 JST 2019
3回目タスク終了Thu May 30 22:07:44 JST 2019
-----------------------------------------
4回目タスク開始Thu May 30 22:07:46 JST 2019
4回目タスク終了Thu May 30 22:07:49 JST 2019
-----------------------------------------
5回目タスク開始Thu May 30 22:07:51 JST 2019
5回目タスク終了Thu May 30 22:07:54 JST 2019
-----------------------------------------
6回目タスク開始Thu May 30 22:07:56 JST 2019
6回目タスク終了Thu May 30 22:07:59 JST 2019
:
:

となります。

開始時刻を確認すると5秒感間隔で開始されていることが確認できます。次にscheduleメソッドで実行してみます。

package action;

import java.util.Date;
import java.util.Timer;

public class Sample {

  public static void main(String[] args) {

    // Timerクラスのオブジェクトを作成
    Timer time = new Timer();

    System.out.println("実行開始" + new Date());

    // 一定間隔で処理を開始する
    // SampleTaskを、3秒後に、5秒間隔で実行する
    time.schedule(new SampleTask(), 3000, 5000);
  }
}

実行結果は

実行開始Thu May 30 22:33:55 JST 2019
-----------------------------------------
1回目タスク開始Thu May 30 22:33:58 JST 2019
1回目タスク終了Thu May 30 22:34:01 JST 2019
-----------------------------------------
2回目タスク開始Thu May 30 22:34:03 JST 2019
2回目タスク終了Thu May 30 22:34:06 JST 2019
-----------------------------------------
3回目タスク開始Thu May 30 22:34:08 JST 2019
3回目タスク終了Thu May 30 22:34:11 JST 2019
-----------------------------------------
4回目タスク開始Thu May 30 22:34:13 JST 2019
4回目タスク終了Thu May 30 22:34:16 JST 2019
-----------------------------------------
5回目タスク開始Thu May 30 22:34:18 JST 2019
5回目タスク終了Thu May 30 22:34:21 JST 2019
-----------------------------------------
6回目タスク開始Thu May 30 22:34:23 JST 2019
6回目タスク終了Thu May 30 22:34:26 JST 2019
:
:

となります。

 

監修してくれたメンター

長屋雅美

独立系SIerで7年勤務後、現在はフリーのエンジニアとして自宅をオフィスとして活動しています。
JavaやC♯、shellscriptを用いた開発を主に担当し、TechAcademyではJavaコースを担当しています。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

TechAcademyでは、初心者でもJavaやServletの技術を使ってWebアプリケーション開発を習得できるオンラインブートキャンプJava講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。