JavaFXです。TimerlineクラスとTimerTaskクラスは、それぞれどのような特徴を持っているのでしょうか。どちらのクラスも同じようなループをしているように感じるのですが…
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
ベストアンサー
一定時間ごとに何かをするためのクラスという大まかな意味では「同じようなループをしている」というように見えるかも知れませんが、きちんと機能を把握した上で実際にどのように使うかを考えてみれば全然違うものに見えると思います。
###java.util.TimerTask
APIリファレンスを見ると明らかですが、TimerTaskはそれ自身では待機時間の指定やループなど「時間に対する処理をスケジュールする機能」は(cancelメソッドを除き)持っていません。スケジューリング機能はjava.util.Timerの方が担っています。
Timelineとの比較でいうと、java.util.Timer/java.util.TimerTaskはより汎用的・単純な機能となっています。それでできることは「任意のバックグラウンドスレッドにて時間の経過により起動される処理をスケジュールすることだけ」です。
###javafx.animation.Timeline
こちらはJavaFXの画面を構成する任意のNodeの任意の属性(JavaFXプロパティー)の値を任意のフレームレートでアニメーションさせるためのクラスであり、JavaFX特化クラスというべきものです。
Timer/TimerTaskに比べてTimelineの違いをいくつか列挙してみますと・・・
- 補完
アニメーションをするための重要な機能としてTimelineの方にはKeyFrame/KeyValueにより時間経過に応じて画面が連続的に変化するように補完を行ってくれます。例えば1秒ごとに図形を100ピクセル移動させるといった場合、フレームレートを20と指定すると0.05秒ごとに5ピクセルずつ移動するような動きを自動的に行ってくれます。Timer/TimerTaskにはこうした機能はありません。
- 処理が起動されるスレッド
TimelineはJavaFXの制御を行う目的で使うもののため、onFinishedHandlerなどはJavaFXアプリケーションスレッドで起動されるようになっています。対してTimer/TimerTaskはそれ専用のスレッドでハンドラーが起動します。
- 時間の扱い
Timerは相対的な時間ベースで動作するようです。例えば0.1秒ごとにある処理をしようとするとき、なんらかの都合のため処理に遅延が発生した場合(例えばGCが発生した場合など)それ以降のTimerTask起動契機は絶対時間に対して遅れが生じます。
これに対してTimelineはなんらかの都合で途中に遅延が発生してもその遅延が蓄積するようなことはなく、あくまで絶対時間を基準にアニメーションされます。
例えば10秒ごとに図形が左->右->左というループアニメーションをしようとする場合、極端な話、Timer/TimerTaskで実現すると1000秒後には図形が初期状態(左端)にあるかどうかは保証されません。一方Timelineでは1000秒後には(若干の誤差を除けば)初期状態の位置にあることが保証されるようです。この時間の扱いの違いについてAPIリファレンスにははっきりと書いてないと思いますが、通常アニメーションをするときには音声や画像などを同期させたりする都合上、絶対時間ベースで動作してほしいと期待すると思います(そうでないとTimelineというクラス名は看板倒れということになってしまうと思います)。Timelineの実装を調べていくとそれが内部的に用いているMasterTimerというクラスのJava Docコメントにひそかに「絶対時間で動作する」と記述されていました。
投稿2017/07/29 09:19
総合スコア18404
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/30 03:54