Tengo un método con HandlerThread
. Se cambia un valor dentro de Thread
y me gustaría devolverlo al test()
método. ¿Hay alguna forma de hacer esto?
public void test()
{
Thread uiThread = new HandlerThread("UIHandler"){
public synchronized void run(){
int value;
value = 2; //To be returned to test()
}
};
uiThread.start();
}
java
android
multithreading
Neeta
fuente
fuente
Respuestas:
Puede utilizar una matriz de variables final local. La variable debe ser de tipo no primitivo, por lo que puede usar una matriz. También necesita sincronizar los dos hilos, por ejemplo, usando un CountDownLatch :
También puede usar un
Executor
y unCallable
como este:fuente
Por lo general, lo harías de esta manera
Luego puede crear el hilo y recuperar el valor (dado que el valor se ha establecido)
tl;dr
un hilo no puede devolver un valor (al menos no sin un mecanismo de devolución de llamada). Debe hacer referencia a un hilo como una clase ordinaria y preguntar por el valor.fuente
The method getValue() is undefined for the type Thread
.t.getValue()
afoo.getValue()
.Thread t = new Thread(foo); t.start(); t.join(); foo.getValue();
. Lost.join()
bloques hasta terminar el hilo.Lo que está buscando es probablemente la
Callable<V>
interfaz en lugar deRunnable
y recuperar el valor con unFuture<V>
objeto, lo que también le permite esperar hasta que se haya calculado el valor. Puede lograr esto con unExecutorService
, que puede obtener deExecutors.newSingleThreadExecutor()
.fuente
¿Qué tal esta solución?
No usa la clase Thread, pero ES concurrente y, de alguna manera, hace exactamente lo que solicita
Ahora todo lo que debe hacer es decir
value.get()
cada vez que necesite tomar su valor devuelto, el hilo se inicia en el mismo segundo en que davalue
un valor para que nunca tenga que decirthreadName.start()
.Lo que
Future
es, es una promesa al programa, usted le promete al programa que obtendrá el valor que necesita en algún momento en el futuro cercanoSi lo llama
.get()
antes de que termine, el hilo que lo llama simplemente esperará hasta que esté listofuente
Si desea obtener el valor del método de llamada, debe esperar a que finalice el hilo, lo que hace que el uso de hilos sea un poco inútil.
Para responder directamente a su pregunta, el valor se puede almacenar en cualquier objeto mutable al que tanto el método de llamada como el hilo tienen una referencia. Podrías usar el exterior
this
, pero eso no será particularmente útil más que para ejemplos triviales.Una pequeña nota sobre el código en la pregunta: la extensión
Thread
suele ser un estilo deficiente. De hecho, extender las clases innecesariamente es una mala idea. Noto que surun
método está sincronizado por alguna razón. Ahora, como el objeto en este caso es elThread
, puede interferir con lo que sea queThread
use su bloqueo (en la implementación de referencia, algo que ver conjoin
IIRC).fuente
Desde Java 8 en adelante tenemos CompletableFuture. En su caso, puede usar el método supplyAsync para obtener el resultado después de la ejecución.
Encuentre alguna ref. aquí https://www.baeldung.com/java-completablefuture#Processing
fuente
El uso de Future descrito en las respuestas anteriores hace el trabajo, pero un poco menos significativamente ya que f.get () bloquea el hilo hasta que obtiene el resultado, lo que viola la concurrencia.
La mejor solución es utilizar ListenableFuture de Guava. Un ejemplo :
fuente
Con pequeñas modificaciones en su código, puede lograrlo de una manera más genérica.
Solucion:
Handler
subproceso en la interfaz de usuario, que se llama comoresponseHandler
Handler
desdeLooper
UI Thread.HandlerThread
, publicar un mensaje en esteresponseHandler
handleMessgae
muestra unToast
valor recibido del mensaje. Este objeto de mensaje es genérico y puede enviar diferentes tipos de atributos.Con este enfoque, puede enviar varios valores al hilo de la interfaz de usuario en diferentes momentos. Puede ejecutar (publicar) muchos
Runnable
objetos en estoHandlerThread
y cada unoRunnable
puede establecer un valor en elMessage
objeto, que puede ser recibido por UI Thread.fuente