câu hỏi tương tự:Bọc một tính toán không đồng bộ thành một (chặn) tính toán đồng bộ
- Pattern for wrapping an Asynchronous JavaScript function to make it synchronous
- Wrapping an asynchronous method synchronously in C#
tôi có một đối tượng với một phương pháp tôi muốn tiếp xúc với khách hàng thư viện (đặc biệt là khách hàng tạo kịch bản) như một cái gì đó như:
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
}
nhưng "công cụ" nguyên thủy tôi có sẵn là một tập các lớp hướng sự kiện:
interface BazComputationSink
{
public void onBazResult(Baz result);
}
class ImplementingThing
{
public void doSomethingAsync(Foo fooArg, Bar barArg, BazComputationSink sink);
}
nơi ImplementingThing mất đầu vào, thực hiện một số nội dung phức tạp như enqueueing thứ trên một hàng đợi công việc, và sau đó khi một kết quả xảy ra , sink.onBazResult()
được gọi trên một chuỗi có thể hoặc có thể không phải là cùng một luồng như ImplementingThing.doSomethingAsync() đã được gọi.
Có cách nào tôi có thể sử dụng các hàm theo hướng sự kiện mà tôi có, cùng với các nguyên thủy đồng thời, để triển khai MyNiceInterface để các trình khách script có thể vui vẻ chờ một luồng chặn không?
chỉnh sửa: tôi có thể sử dụng FutureTask cho việc này không?
(+1) giải pháp tốt đẹp – skaffman
+1 bởi vì tôi nghĩ rằng tôi hiểu nó .... nhưng bạn có thể giải thích các khía cạnh đồng thời không? (việc sử dụng chốt đếm ngược) –
bạn cũng đang thiếu "done = true" ở đâu đó trong onBazResult() .... –