もう1つの非同期処理用クラス
RemoteTextDocumentクラスもHttpRequestクラスも通信を非同期に行うためのクラスでした。では,
非同期に処理を行うには,
AbstractAsyncOperationクラスは名前からもわかるようにアブストラクトクラスなので,
AbstractAsyncOperationクラスは,
Java側ではcom.
JavaのAbstractAsyncOperationクラスはConcurrency Utilitiesに含まれるCallableインターフェースを実装しています。しかし,
Javaで非同期処理を行う場合,
そのため,
あまり意味はないのですが,
リスト8
public class LongLongTaskImpl extends AbstractAsyncOperation<Date> {
public LongLongTaskImpl(AsyncOperationListener<Date> listener) {
super(listener);
}
// 非同期にコールされるメソッド
@Override
public Date call() {
try {
// 10秒スリープ
Thread.sleep(10000L);
} catch (InterruptedException ex) {
// 非同期処理のキャンセルが行われると,
// InterruptedException例外が発生する
// このため,InterruptedException例外が発生した時に
// 速やかにcallメソッドを抜け出る必要がある
}
// 現在時刻を返す
return new Date();
}
}
LongLongTaksImplクラスのコンストラクタの引数であるAsyncOperationListenerインターフェースは,
非同期処理はcallメソッドに記述します。callメソッドの戻り値はクラス定義のジェネリクスパラメータと同一にします。ここでは,
callメソッドでは10秒間スリープした後,
重要なのはInterruptedException例外の扱いです。非同期処理がキャンセルされた場合,
では,
リスト9
public class LongLongTask extends AbstractAsyncOperation {
// 非同期処理の結果
public var result: Date;
// 非同期処理を行うJavaクラス
var task: LongLongTaskImpl;
ublic override function start(): Void {
// 非同期処理の開始
task = new LongLongTaskImpl(listener);
task.start();
}
public override function cancel(): Void {
// 非同期処理のキャンセル
task.cancel();
}
public override function onCompletion(value: Object): Void {
// valueがLongLongTaskImpl#callメソッドの戻り値
result = value as Date
}
}
JavaFXのAbstractAsyncOperationクラスはstart関数,
start関数はJavaのAbstractAsyncOperationクラスのサブクラスを生成して,
最後のonCompletion関数は非同期処理が完了した後にコールされるコールバック関数です。onCompletion関数の引数には,
LongLongTaskImplクラスのコンストラクタで指定したAsyncOperationListenerインターフェースは,
非同期処理を開始するのはAbstractAsyncOperationクラスのstartメソッドです。そこで,
キャンセル処理はそのままLongLongTaskImplオブジェクトのcancelメソッドをコールするだけです。onCompletion関数ではcallメソッドの戻り値であるDateオブジェクトをアトリビュートとして保持させています。