簡體   English   中英

如何在不使用ExecutorService的情況下獲取Future <MyObject>?

[英]How can I get a Future<MyObject> without using ExecutorService?

我真的想做這樣的事情:

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

我基本上想要啟動一個與我的主要任務並行運行的長期運行的任務,並且我不希望池或線程重用。 Executors的東西似乎非常集中,它需要我關閉池,所有這些都是我不想做的。

使用“Callable / Future”模式,因為我后來可能會引入Executors,但是就目前而言,它們只是開銷。

有什么建議 ?

試試FutureTask。 它沒有對Executor框架的任何顯式依賴,並且可以按原樣實例化,或者您可以擴展它以對其進行自定義。

好吧,你可以很容易地編寫一個幫助方法:

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;
}

編輯:要擴展alphazero的答案 ,你可以像這樣使用FutureTask

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

是的,我會說這比我的第一個答案更好:)

可調用/未來的東西基於線程池。 如果您需要多次執行相同的操作,我強烈建議您使用池。

如果您不想使用線程池,那么我建議您手動使用線程。 通過使用單個線程並加入它並不難做到你想要的。

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;
   }
}

要運行此調用:

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

最終你將調用getResult,它將阻塞直到X的線程完成:

x.getResult();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM