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

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

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

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

 

なお本記事は、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] Javaで挫折しない学習方法を動画で公開中

実際に書いてみよう

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

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講座を開催しています。

JavaやServletの技術を使ってWebアプリケーションの開発を学ぶことができます。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間で習得することが可能です。

また、現役エンジニアから学べる無料のプログラミング体験会も実施しているので、ぜひ参加してみてください。