ついにベールを脱いだJavaFX

第11回 通信と非同期処理

この記事を読むのに必要な時間:およそ 12 分

このLongLongTaskクラスを使用するスクリプトを以下に示します。

リスト10

var result: Date = new Date();
 
Timeline {
    repeatCount: Timeline.INDEFINITE
    autoReverse: true
    keyFrames: [
        KeyFrame {
            time: 0s
            action: function() {
            	// 非同期処理クラスを生成し,非同期処理を開始する
                def task: LongLongTask;
                task = LongLongTask {
                    // 非同期処理後にコールされる関数
                    onDone: function(flag: Boolean) : Void {
                        result = task.result;
                    }
                }
            }
        },
        KeyFrame {
            time: 5s
        }
    ]
}.play();
 
var ball = Circle { <<省略>> }
 
    <<省略>>
    
Stage {
    title: "Long Long Task"
    scene: Scene {
        width: 300
        height: 200
        content: [ 
            ball,
            Text {
                font : Font {
                    size: 20
                }
                x: 10,
                y: 100
                content: bind "{result}"
            }
        ]
    }
}

ここでは,アニメーションするボールと非同期処理から得られる時間を表示しています。非同期処理はTimelineクラスを使用して5秒ごとに行うことにしました。

AbstractAsyncOperationクラスのサブクラスは生成するだけで自動的にstart関数がコールされます。したがって,明示的にstart関数をコールする必要はありません。

非同期処理クラスを使用するスクリプトが非同期処理が終わった後にコールバック関数を設定したい場合,赤字で示したようにonDoneアトリビュートに記述します。関数の引数は非同期処理が成功したかどうかを示すフラグです。

実行結果を図5に示します。図5はアプレットページにリンクにしていますので,ぜひ実際にアプレットで確かめてみてください。スレッドをブロックしていても,アニメーションはスムーズに行われていることがわかるはずです。

このようにAbstractAsyncOperationクラスを用いれば,非同期処理の結果を受け渡すことはできました。

しかし,そのままでは途中経過を引き渡すことができません。一方のSwingWorkerクラスでは途中までの情報をpublishメソッドとprocessメソッドのペアで受け渡すことができます図4のFlickrAtomViewerで使用しています⁠⁠。AbstractAsyncOperationクラスでもこのようなデータの受け渡しが欲しいところです。

ここではソースの解説は行いませんが,図6に示したマンデルブロ集合を描画するスクリプトは,キューを用いてスレッド間のデータの受け渡しを行っています。

キューとはリストやマップなどと同じようにデータのコンテナの一種です。キューにはデータを追加するメソッドと,データを取り出すメソッドが定義されています。データは1つずつ追加し,取り出す時も1つずつです。キューの特徴としてデータを取り出す順番が追加された順と同じになります。はじめに追加したデータが,はじめに取り出せるということでFIFO (First In, First Out)と呼ばれます。

キューはイベント駆動のアプリケーションや,複数のスレッドでタスクを受け渡す時によく使用されます。実際に,JavaFXもユーザインターフェースのイベントをキューに入れ,イベントディスパッチスレッドがキューからイベントを取り出して処理をするというアーキテクチャになっています。

アプレットページにソースも示しましたので,参考にしてください。

著者プロフィール

櫻庭祐一(さくらばゆういち)

横河電機に勤務するかたわらJava in the Boxにて新しい技術を追い続けています。JavaOneは今年で11年目。名実共にJavaOneフリークと化しています。