在最简单的情况下,您可以使用 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();
}
注意:您可以在 Runnable 中实现关闭标志而不是 Thread.setDaemon(),因为这将是一个更好的解决方案。
[/编辑]