Подтвердить что ты не робот

Как я могу получить Future <MyObject> без использования ExecutorService?

Мне бы очень хотелось сделать что-то вроде этого:

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

В основном я хочу запустить одну длительную задачу, которая выполняется параллельно с моей основной задачей, и я не хочу, чтобы объединение или повторное использование потоков. Материал исполнителей кажется очень ориентированным на объединение, и он требует, чтобы я закрыл пул, и все, что я не хочу делать.

Я хочу использовать шаблон "Callable/Future", потому что позже мне может понадобиться представить Executors, но, как сейчас, они просто накладные.

Любые предложения?

4b9b3361

Ответ 1

Попробуйте FutureTask. Он не имеет никакой явной зависимости от структуры Executor и может быть инстанцирован как есть, или вы можете расширить его, чтобы настроить его.

Ответ 2

Ну, вы можете довольно легко написать вспомогательный метод:

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 answer вы должны использовать FutureTask следующим образом:

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

И да, я бы сказал, что это лучше, чем мой первый ответ:)

Ответ 3

Вызываемые/будущие вещи основаны на пуле потоков. Если вам нужно делать одну и ту же операцию много раз, я настоятельно рекомендую использовать пул.

Если вы не хотите использовать пул потоков, я бы предложил использовать поток вручную. Нетрудно сделать то, что вы хотите, используя один поток и присоединяясь к нему.

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();