2011-10-10 43 views
12

¿Cómo asigno Status con CallMe() usando isFinish() para haber devuelto el valor verdadero?¿Cómo obtengo el valor devuelto por el método Thread Runnable interno en Java?

public static boolean isFinish() 
{  
    boolean Status = false; 
    new Thread(new Runnable() 
    { 
    public void run() 
    { 
     /* This shell return true or false 
     * How do you keep it in Status 
     */ 
     CallMe(); 
    } 
    }).start(); 

    /* How can i get the true or false exactly from CallMe? here */ 
    return Status; 
} 

public static boolean CallMe() 
{ 
    /* some heavy loads ... */ 
    return true; 
} 
+3

¿Por qué utilizar el hilo en absoluto? El inicio() creará un hilo de ejecución separado y en ese punto isFinish continuará su ejecución. –

Respuesta

27

Hay dos formas de hacerlo. El primero es usar un resultado de cálculo futuro y el otro es tener una variable compartida. Creo que el primer método es mucho más limpio que el segundo, pero a veces también se necesitan valores para el hilo.

  • Usando RunnableFuture.

FutureTask implementa un RunnableFuture. Entonces crea esa tarea que, una vez ejecutada, tendrá un valor.

RunnableFuture f = new FutureTask(new Callable<Boolean>() { 
    // implement call 
}); 
// start the thread to execute it (you may also use an Executor) 
new Thread(f).start(); 
// get the result 
f.get(); 
  • El uso de una clase titular

Se crea una clase que contiene un valor y compartir una referencia a esa clase. Puede crear su propia clase o simplemente usar el AtomicReference. Por clase de titular, me refiero a una clase que tiene un atributo público modificable.

// create the shared variable 
final AtomicBoolean b = new AtomicBoolean(); 
// create your thread 
Thread t = new Thread(new Runnable() { 
    public void run() { 
    // you can use b in here 
    } 
}); 
t.start(); 
// wait for the thread 
t.join(); 
b.get(); 
+0

+1, buena respuesta –

+0

+1, como dos métodos, realmente gracias. Necesitaba tener dúplex completo, ambos me dan la mejor dirección. – YumYumYum

+0

¡gracias! Necesitaba esto para mi proyecto universitario, ayudaste mucho. –

3

vuelve a escribir el código para utilizar Callable<Boolean> y obtener una Future cuando inicia la Runnable.

Los futuros permiten que el hilo de inicio compruebe correctamente que el valor esté listo y lo lea de forma asíncrona. Puede hacer la codificación a mano, pero dado que Future ahora es parte de las bibliotecas estándar de JVM, ¿por qué lo haría (fuera de una clase de programación)?

1

Al trabajar con subprocesos sin procesar, puede implementar Runnable con un tipo con nombre y almacenar el valor en él.

class MyRunnable implements Runnable { 
    boolean status; 

    public void run() { 
     ... 
    } 
} 

Sin embargo, si está trabajando con otro hilo, tendrá que sincronizar de alguna manera.

Sería más fácil usar las herramientas de nivel superior proporcionadas por la jerarquía java.util.concurrent. Puede enviar un Llamado a un Ejecutor y obtener un Futuro. Puedes preguntarle al futuro si está hecho y obtener el resultado. Hay un Oracle tutorial here.

Cuestiones relacionadas