類似的問題:包裝紙異步計算到同步(阻塞)計算
- Pattern for wrapping an Asynchronous JavaScript function to make it synchronous
- Wrapping an asynchronous method synchronously in C#
我有一個方法的對象我想暴露到庫客戶機(尤其是腳本客戶端)如下所示:
interface MyNiceInterface
{
public Baz doSomethingAndBlock(Foo fooArg, Bar barArg);
public Future<Baz> doSomething(Foo fooArg, Bar barArg);
// doSomethingAndBlock is the straightforward way;
// doSomething has more control but deals with
// a Future and that might be too much hassle for
// scripting clients
}
但原始的「東西」我可以是一組事件驅動類:
interface BazComputationSink
{
public void onBazResult(Baz result);
}
class ImplementingThing
{
public void doSomethingAsync(Foo fooArg, Bar barArg, BazComputationSink sink);
}
其中ImplementingThing需要投入,做一些神祕的東西,就像一個任務隊列進行排隊的東西,再後來當結果出現,sink.onBazResult()
被調用的線程可能與調用ImplementingThing.doSomethingAsync()的線程相同或不同。
有沒有一種方法可以使用事件驅動的函數以及併發基元來實現MyNiceInterface,以便腳本客戶端可以愉快地等待阻塞線程?
編輯:我可以使用FutureTask嗎?
(+1)很好的解決方案 – skaffman 2010-02-01 22:27:34
+1,因爲我認爲我理解它......但是您能解釋併發性方面嗎? (使用倒計時鎖存器) – 2010-02-01 22:58:10
你也在onBazResult()中的某個地方缺少「done = true」...... – 2010-02-01 23:01:15