最も単純なケースでは、Thread + 任意の Runnable を使用できます。
呼び出し元の観点から呼び出しをブロックする場合は、ワーカー スレッドを実行し、Thread.join(long)を使用して操作が完了するまで待機するか、指定されたタイムアウト後に操作を破棄する「サービス」クラスを作成できます。 (物事が台無しにならないように、InterruptedExceptionの適切な処理に特に注意してください)。
Thread.isAlive()は、スレッドが終了したかどうかを示します。
結果を取得することは別の問題です。私はあなたがそれに対処できると思います...
[編集]
簡単な例 (本番環境でそのまま使用しないでください! ):
/**
* Actually needs some refactoring
* Also, did not verify for atomicity - should be redesigned
*/
public V theServiceCall(final T param) {
final MyResultBuffer<V> buffer = new MyResultBuffer<V>();
Runnable task = new Runnable() {
public void run() {
V result = ejb.process(param);
buffer.putResult(result);
}
}
Thread t = new Thread(task);
t.setDaemon(true);
t.start();
try {
t.join(TASK_TIMEOUT_MILLIS);
} catch (InterruptedException e) {
// Handle it as needed (current thread is probably asked to terminate)
}
return (t.isAlive()) ? null : buffer.getResult();
}
注: Thread.setDaemon() の代わりに、Runnable にシャットダウン フラグを実装することができます。
[/編集]