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

Вот вариант numpy:

import numpy as np

_, cts = np.unique(df.values, axis=0, return_counts=True)
len(np.where(cts == 1)[0])
#2
15
задан krosenvold 8 May 2009 в 11:41
поделиться

3 ответа

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

17
ответ дан 1 December 2019 в 01:53
поделиться

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

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

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();
1
ответ дан 1 December 2019 в 01:53
поделиться

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

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

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

14
ответ дан 1 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: