Ответ 1
Попробуйте FutureTask. Он не имеет никакой явной зависимости от структуры Executor и может быть инстанцирован как есть, или вы можете расширить его, чтобы настроить его.
Мне бы очень хотелось сделать что-то вроде этого:
Callable<MyObject> myCallable = ....
Future<MyObject> = new Thread( myCallable).start();
В основном я хочу запустить одну длительную задачу, которая выполняется параллельно с моей основной задачей, и я не хочу, чтобы объединение или повторное использование потоков. Материал исполнителей кажется очень ориентированным на объединение, и он требует, чтобы я закрыл пул, и все, что я не хочу делать.
Я хочу использовать шаблон "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 answer вы должны использовать 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();