2009-05-08 9 views
12

realmente me gustaría hacer algo como esto:¿Cómo puedo obtener un Future <MyObject> sin utilizar ExecutorService?

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

Básicamente quiero empezar una única tarea de larga duración que se ejecuta en paralelo con mi tarea principal, y no quiero que la puesta en común o de hilos de reutilización . Las cosas de los ejecutores parecen estar muy orientadas a la agrupación y me obligan a cerrar el grupo, lo que no quiero hacer.

quiero para usar el patrón "Callable/Futuro" porque más adelante tendré que presentar a los ejecutores, pero como están las cosas en este momento, solo están sobrecargadas.

¿Alguna sugerencia?

Respuesta

13

Pruebe FutureTask. No tiene ninguna dependencia explícita en el marco Executor y se puede crear una instancia tal cual, o puede ampliarlo para personalizarlo.

12

Bueno, se puede escribir con bastante facilidad un método de ayuda:

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: Para ampliar alphazero's answer, tendrá que utilizar FutureTask así:

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

Y sí, me gustaría decir esto es mejor que mi primera respuesta :)

1

Las cosas invocables/futuras se basan en la agrupación de subprocesos. Si necesita hacer la misma operación muchas veces, le recomiendo usar un grupo.

Si no desea utilizar un grupo de subprocesos, le sugiero que utilice un subproceso manualmente. No es difícil hacer lo que quiera utilizando un único hilo y uniéndose a él.

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

Para ejecutar esta llamada:

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

Finalmente se llame getResult que bloqueará hasta que el hilo de X es completa:

x.getResult(); 
Cuestiones relacionadas