質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

3555閲覧

java timerクラスについて

kisaragizinzin7

総合スコア90

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/07/15 04:14

javaについて勉強中です。

一定時間経過した後に、下の処理を実行させるような簡単なプログラムの作り方を、 教えていただけないでしょうか?
timerクラスを使えばいいみたいなのですが使い方がわかりません。

System.out.println("おはよう");

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

まず EventListener について学ぶ必要があるようです。
また、タイマのイベント発行は通常 one-shot, continuous の2種類に大別されます。

EventListenerについて理解ができていれば、自分の処理の中でタイマ・イベントの発行及びハンドリングする処理を記述すればよいことになります。
その際、イベント発行や実装方法によってはタイマーの開始の他に明示的な停止の手続きも必要になると思います。

それらを踏まえた上で以下のサイトを読んでみると、タイマの使い方が理解できると思います。
ttp://www.ibm.com/developerworks/jp/java/library/j-schedule/

投稿2015/07/15 05:17

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eripong

2015/07/15 05:49

このサイトは2003年のもので、Timerを使ってExecutotServiceのようなものを実装しているようで、情報としては古すぎると思います。
kisaragizinzin7

2015/07/15 06:20

回答ありがとうございます^^ EventListenerとはクラスのことですか?
退会済みユーザー

退会済みユーザー

2015/07/15 06:35

もちろんクラスですが、それよりもイベントをやりとりする仕組みと捉えて欲しいです。 なにかしらのオブジェクトからイベントの発行があり、そのイベントの発行に応じて処理を行いたい。という場合に利用する仕組みです。 タイマの場合なら、指定時間が経過した場合にイベントが発行され、それに応じた処理を記述する形になります。 一般的にはGUIのハンドリングを行う場合に用いるのですが、タイムクリティカルでない処理であればタイマ処理のような場合でも利用できます。 知っておくとGUIを用いるプログラムを書く場合にも困りませんし、覚えておいて損はないと思います。
guest

0

ベストアンサー

** ※ GUI(Swing, JavaFXなど)の場合は、また別のクラスを使用する必要があります(動くけど正しくない)ので、ご注意ください。 **

メインスレッドで一定時間待機する場合は、Thread.sleepか、その類似APIを使用します。

Thread.sleep - Java8 API ドキュメント
TimeUnit#sleep - Java8 API ドキュメント

メインスレッド以外でバックグラウンド処理させるには、ScheduledExecutorServiceを使うと良いです。

ScheduledExecutorService - Java8 API ドキュメント

いずれにしても、マルチスレッドについて少し知る必要があると思います。

サンプルコード:

lang

1import java.util.concurrent.Executors; 2import java.util.concurrent.ScheduledExecutorService; 3import java.util.concurrent.TimeUnit; 4 5try { 6 Thread.sleep(1500L); // メインスレッドで1.5秒待機 7 System.out.println("おはよう"); 8} catch (InterruptedException e) { 9 e.printStackTrace(); 10} 11try { 12 TimeUnit.MINUTES.sleep(1L); // メインスレッドで1分待機 13 System.out.println("おはよう"); 14} catch (InterruptedException e) { 15 e.printStackTrace(); 16} 17 18ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 19// Java8の書き方 20scheduler.schedule(() -> System.out.println("おはよう"), 1L, TimeUnit.SECONDS); // 1秒後に別スレッドで実行

投稿2015/07/15 05:08

編集2015/07/15 06:47
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2015/07/15 05:42

回答ありがとうございます^^ 初心者ですみませんが、マルチスレッドとはどういったものでしょうか? java.util.concurrent.Executors; java.util.concurrent.ScheduledExecutorService; java.util.concurrent.TimeUnit; これですかね?
argius

2015/07/15 05:59

マルチスレッドとは、特定の言語の技術ではなく、プログラミング全般の話です。 ざっくりいうと、プログラムはスレッドが走って処理を実行しています。 マルチスレッドとは、スレッドを複数用意して協調させて処理させる必要がある場合のことを指します。
kisaragizinzin7

2015/07/15 06:18

そういうことでしたか。 ありがとうございます。 よろしければ、下の3つはどういう機能かおしえていたでけませんか? java.util.concurrent.Executors; java.util.concurrent.ScheduledExecutorService; java.util.concurrent.TimeUnit; またサンプルコードの最後2行もどういったことをしているのか教えていただきたいです。 ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // Java8の書き方 scheduler.schedule(() -> System.out.println("おはよう"), 1L, TimeUnit.SECONDS); //
argius

2015/07/15 06:41

java.util.concurrent.Executorsは、ExecutorServiceやScheduledExecutorServiceを準備するためのファクトリー(オブジェクト生成を担当するクラス)という役割を持っています。 java.util.concurrent.ScheduledExecutorServiceは、別スレッドでスケジュールした時間にタスクを実行するクラス(厳密にはインターフェイス)です。 java.util.concurrent.TimeUnitは、時間の単位を表します。 手前味噌で恐縮ですが、下記のページにこれらの使い方が書いてありますので、よろしければご覧ください。 http://argius.hatenablog.jp/entry/20131226/1388068061 http://argius.hatenablog.jp/entry/2015/03/16/092237 サンプルコードの最後2行は、こんな感じです。 1行目:スケジュール実行用のスレッドを1つ持ったスレッドプールを準備 2行目:1秒後にタスク(この場合はSystem.out.println("おはよう"))をスケジュール実行用スレッドに実行させる
argius

2015/07/15 06:48

冒頭にGUIの場合の但し書きを追記しました。
退会済みユーザー

退会済みユーザー

2015/07/15 06:52 編集

argiusさんが回答に書かれている「ScheduledExecutorService - Java8 API ドキュメント 」のリンク先を読んでみてください。(勉強中だと半分も理解できないかもしれませんが、最初はそんなものです。不明な部分は1つずつじっくり調べてみてください。) 簡単に説明すると "ScheduledExecutorService" が、スレッド実行を提供してくれるクラスです。このクラスは "Executors" から生成されます。 そして、ScheduledExecutorServiceクラスの "schedule" メソッドでタイマ設定を行いますが、その際の経過時間の単位として "TimeUnit" の定義が必要になります。 その為に、3つのモジュールを読み込んでいるんです。 (すみません、横からなんとなく書いたら重複してしまいました..)
kisaragizinzin7

2015/07/15 23:44

argius 詳しい回答ありがとうございます^^ pikovolt いえいえ^^ 回答していただいてありがとうございます!
argius

2015/07/15 23:53

pikovoltさん 補足ありがとうございます。 kisaragizinzin7さん Timerクラスは古いAPIなので、機能もあまり多くありません。 もしTimerクラスで不足することがありましたら、ScheduledExecutorService関連も試してみてください。
kisaragizinzin7

2015/07/16 01:30

ScheduledExecutorServiceでやってみたいと思います^^ 質問なのですが、 try文は例外処理を行う文で、try文の中身(書いてくださったコードではThread.sleep(1500L); // メインスレッドで1.5秒待機 System.out.println("おはよう");)に例外がなければ、catch文の処理を行うと理解できたのですが、catch文の (InterruptedException e) { e.printStackTrace(); はどういうことを表しているのでしょうか? 調べてみたのですが、イマイチわからなくて。 また例外処理という意味なのですが、 try文の中身がエラーなどのようなおかしな点があれば、catch文の中身の処理を行い、 なければ、try文の中身の処理を行うといった解釈であっていますでしょうか? すみませんが、よろしくお願いいたします。
argius

2015/07/16 02:25

try文については、tryの中では例外(Exception)がスローされなければ処理を順番に行います。例外がスローされたら、その時点でcatch文に制御が移ります。 例外は、throw文を使ってスローします。もちろん自分で書くこともできます。 InterruptedExceptionについては、少し難しい話になりますが、今処理しているスレッドがほかのスレッドに割り込み(Thread#interrupt)をかけられた場合にスローされる例外です。 e.printStackTrace()は、例外の「スタックトレース」を出力するメソッドの呼び出しです。スタックトレースについては別途調べてみてください。 一度にたくさん分からないことが出てきて大変だと思いますが、がんばってください。
kisaragizinzin7

2015/07/16 03:58

解説ありがとうございます! ありがとうございます^^ 頑張ります!
guest

0

java.util.Timerを使うならこんな感じでしょうかね。
10秒後に「タイマーからおはよう」が出力されます。

import java.util.Timer;
import java.util.TimerTask;

public class test {
public static void main(String[] args) {
TimerTask timerTask = new TimerTask(){
public void run() {
System.out.println("タイマーからおはよう");
}
};
System.out.println("おはよう");
Timer timer = new Timer();
timer.schedule(timerTask, 10000L);
}

}

投稿2015/07/15 05:13

shigeo.h

総合スコア90

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2015/07/15 05:48

回答ありがとうございます^^ これはrunメソッドの中身が一定時間後に出力されるようになっているんですかね?
shigeo.h

2015/07/15 06:15

そうですね。 timer.schedule(timerTask, 10000L); なので 10秒後にrun()が実行され、「タイマーからおはよう」と出力されます。
kisaragizinzin7

2015/07/15 06:24

理解できました^^ ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問