2009-05-08 23 views
12

Tôi thực sự muốn làm một cái gì đó như thế này:Làm cách nào để có được Tương lai <MyObject> mà không cần sử dụng ExecutorService?

Callable<MyObject> myCallable = .... 
Future<MyObject> = new Thread(myCallable).start(); 

tôi về cơ bản muốn bắt đầu một nhiệm vụ lâu dài đơn chạy song song với nhiệm vụ chính của tôi, và tôi không muốn tổng hợp hoặc sợi tái sử dụng . Các công cụ của Executors dường như rất định hướng và nó đòi hỏi tôi phải đóng cửa hồ bơi, tất cả những gì tôi không muốn làm.

Tôi muốn để sử dụng mẫu "Có thể gọi/tương lai" vì sau này tôi có thể giới thiệu Executors, nhưng vì mọi thứ hiện tại chỉ là chi phí.

Mọi đề xuất?

Trả lời

13

Thử FutureTask. Nó không có bất kỳ sự phụ thuộc rõ ràng nào trên khung công tác Executor và có thể được khởi tạo như là, hoặc bạn có thể mở rộng nó để tùy chỉnh nó.

12

Vâng, bạn có thể khá dễ dàng viết một phương thức helper:

public static Future<T> createFuture(Callable<T> callable) 
{ 
    ExecutorService service = Executors.newSingleThreadExecutor(); 
    Future<T> ret = service.submit(callable); 
    // Let the thread die when the callable has finished 
    service.shutdown(); 
    return ret; 
} 

EDIT: Mở rộng trên alphazero's answer, bạn muốn sử dụng FutureTask như thế này:

FutureTask<MyObject> future = new FutureTask<MyObject>(myCallable); 
new Thread(future).start(); // FutureTask implements Runnable 
// Now use the future however you want 

Và vâng, tôi muốn nói điều này đẹp hơn câu trả lời đầu tiên của tôi :)

1

Nội dung có thể gọi/tương lai được dựa trên tổng hợp chuỗi. Nếu bạn cần thực hiện thao tác tương tự nhiều lần, tôi khuyên bạn nên sử dụng một hồ bơi.

Nếu bạn không muốn sử dụng nhóm chủ đề, khi đó tôi sẽ đề xuất sử dụng một chuỗi theo cách thủ công. Nó không phải là khó để làm những gì bạn muốn bằng cách sử dụng một sợi đơn và tham gia vào nó.

class X extends Thread { 
    MyObject result; 

    public void run() { 
     // .. do the operation here. Set result 
    } 

    public MyObject getResult() { 
     // This will block until the thread is complete 
     join(); 
     return result; 
    } 
} 

Để chạy cuộc gọi này:

X x = new X(); 
x.start(); 

cuối cùng bạn sẽ gọi getResult mà sẽ ngăn chặn cho đến khi chủ đề X hoàn tất:

x.getResult(); 
Các vấn đề liên quan