Tengo un método con HandlerThread. Se cambia un valor dentro de Thready 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
Executory unCallablecomo 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;drun 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 deRunnabley 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 davalueun valor para que nunca tenga que decirthreadName.start().Lo que
Futurees, 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
Threadsuele ser un estilo deficiente. De hecho, extender las clases innecesariamente es una mala idea. Noto que surunmétodo está sincronizado por alguna razón. Ahora, como el objeto en este caso es elThread, puede interferir con lo que sea queThreaduse su bloqueo (en la implementación de referencia, algo que ver conjoinIIRC).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:
Handlersubproceso en la interfaz de usuario, que se llama comoresponseHandlerHandlerdesdeLooperUI Thread.HandlerThread, publicar un mensaje en esteresponseHandlerhandleMessgaemuestra unToastvalor 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
Runnableobjetos en estoHandlerThready cada unoRunnablepuede establecer un valor en elMessageobjeto, que puede ser recibido por UI Thread.fuente