Eu tenho um método com um HandlerThread
. Um valor é alterado dentro do Thread
e eu gostaria de devolvê-lo ao test()
método. Existe uma maneira de fazer isso?
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
fonte
fonte
Respostas:
Você pode usar uma matriz de variável final local. A variável precisa ser do tipo não primitivo, então você pode usar uma matriz. Você também precisa sincronizar os dois threads, por exemplo, usando um CountDownLatch :
Você também pode usar um
Executor
e umCallable
como este:fonte
Normalmente você faria algo assim
Em seguida, você pode criar o segmento e recuperar o valor (desde que o valor tenha sido definido)
tl;dr
um thread não pode retornar um valor (pelo menos não sem um mecanismo de retorno de chamada). Você deve fazer referência a um thread como uma classe comum e pedir o valor.fonte
The method getValue() is undefined for the type Thread
.t.getValue()
parafoo.getValue()
.Thread t = new Thread(foo); t.start(); t.join(); foo.getValue();
. Ost.join()
blocos até que o segmento seja concluído.O que você está procurando provavelmente é a
Callable<V>
interface no lugar deRunnable
e recuperando o valor com umFuture<V>
objeto, o que também permite que você espere até que o valor tenha sido calculado. Você pode conseguir isso com umExecutorService
, do qual você pode obterExecutors.newSingleThreadExecutor()
.fonte
Que tal essa solução?
Ele não usa a classe Thread, mas é concorrente e, de certa forma, faz exatamente o que você pede
Agora, tudo o que você faz é dizer
value.get()
sempre que precisar obter o valor retornado, o encadeamento é iniciado no exato segundo em que você fornecevalue
um valor, para que você nunca precise dizerthreadName.start()
nada sobre ele.O que
Future
é, é uma promessa para o programa, você promete ao programa que obterá o valor de que precisa em um futuro próximoSe você chamá
.get()
-lo antes de terminar, o thread que o está chamando simplesmente esperará até que esteja concluídofonte
Se você quiser o valor do método de chamada, ele deve aguardar o término do thread, o que torna o uso de threads um pouco inútil.
Para responder diretamente a sua pergunta, o valor pode ser armazenado em qualquer objeto mutável, tanto o método de chamada quanto o thread têm uma referência. Você poderia usar o externo
this
, mas isso não será particularmente útil, exceto para exemplos triviais.Uma pequena observação sobre o código em questão: a extensão
Thread
geralmente é um estilo ruim. Na verdade, estender as aulas desnecessariamente é uma má ideia. Percebi que seurun
método está sincronizado por algum motivo. Agora, como o objeto neste caso é o,Thread
você pode interferir com o que quer queThread
use seu bloqueio para (na implementação de referência, algo a ver comjoin
, IIRC).fonte
Do Java 8 em diante, temos CompletableFuture. No seu caso, você pode usar o método supplyAsync para obter o resultado após a execução.
Por favor, encontre algumas ref. aqui https://www.baeldung.com/java-completablefuture#Processing
fonte
Usar Future descrito nas respostas acima faz o trabalho, mas um pouco menos significativamente, como f.get (), bloqueia o thread até obter o resultado, o que viola a simultaneidade.
A melhor solução é usar o ListenableFuture da Guava. Um exemplo :
fonte
Com pequenas modificações em seu código, você pode conseguir isso de uma forma mais genérica.
Solução:
Handler
na UI Thread, que é chamado deresponseHandler
Handler
deLooper
do UI Thread.HandlerThread
, postar mensagem sobre esteresponseHandler
handleMessgae
mostra umToast
com o valor recebido da mensagem. Este objeto Message é genérico e você pode enviar diferentes tipos de atributos.Com essa abordagem, você pode enviar vários valores para o thread de interface do usuário em momentos diferentes. Você pode executar (postar) muitos
Runnable
objetos nesteHandlerThread
e cada umRunnable
pode definir o valor noMessage
objeto, que pode ser recebido pelo UI Thread.fonte