J'ai une méthode avec un HandlerThread
. Une valeur est modifiée dans le Thread
et j'aimerais la renvoyer à la test()
méthode. Y a-t-il un moyen de faire cela?
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
la source
la source
Réponses:
Vous pouvez utiliser un tableau de variables final local. La variable doit être de type non primitif, vous pouvez donc utiliser un tableau. Vous devez également synchroniser les deux threads, par exemple à l'aide d'un CountDownLatch :
Vous pouvez également utiliser un
Executor
et unCallable
comme ceci:la source
Habituellement, vous feriez quelque chose comme ça
Ensuite, vous pouvez créer le thread et récupérer la valeur (étant donné que la valeur a été définie)
tl;dr
un thread ne peut pas renvoyer une valeur (du moins pas sans mécanisme de rappel). Vous devez référencer un thread comme une classe ordinaire et demander la valeur.la source
The method getValue() is undefined for the type Thread
.t.getValue()
àfoo.getValue()
.Thread t = new Thread(foo); t.start(); t.join(); foo.getValue();
. Lest.join()
blocs jusqu'à ce que le fil soit terminé.Ce que vous recherchez est probablement l'
Callable<V>
interface à la place deRunnable
, et la récupération de la valeur avec unFuture<V>
objet, ce qui vous permet également d'attendre que la valeur ait été calculée. Vous pouvez y parvenir avec unExecutorService
, à partir duquel vous pouvez obtenirExecutors.newSingleThreadExecutor()
.la source
Et cette solution?
Il n'utilise pas la classe Thread, mais il est simultané et, d'une certaine manière, il fait exactement ce que vous demandez
Maintenant, tout ce que vous faites est de dire
value.get()
que chaque fois que vous avez besoin de récupérer votre valeur retournée, le thread est lancé à la seconde où vous donnezvalue
une valeur afin que vous n'ayez jamais à dire là-threadName.start()
dessus.Quelle
Future
est, est une promesse au programme, vous promettez le programme que vous obtenez la valeur dont il a besoin dans le futur procheSi vous l'appelez
.get()
avant que ce soit fait, le thread qui l'appelle attendra simplement que ce soit terminéla source
Si vous voulez la valeur de la méthode appelante, alors il doit attendre que le thread se termine, ce qui rend l'utilisation de threads un peu inutile.
Pour répondre directement à votre question, la valeur peut être stockée dans n'importe quel objet mutable auquel la méthode appelante et le thread ont tous deux une référence. Vous pouvez utiliser l'externe
this
, mais cela ne sera pas particulièrement utile à part pour des exemples triviaux.Une petite note sur le code dans la question: l'extension
Thread
est généralement un style médiocre. En effet, étendre les classes inutilement est une mauvaise idée. Je remarque que votrerun
méthode est synchronisée pour une raison quelconque. Maintenant que l'objet dans ce cas est le,Thread
vous pouvez interférer avec tout ce quiThread
utilise son verrou (dans l'implémentation de référence, quelque chose à voir avecjoin
, IIRC).la source
À partir de Java 8, nous avons CompletableFuture. Dans votre cas, vous pouvez utiliser la méthode supplyAsync pour obtenir le résultat après l'exécution.
Veuillez trouver des réf. ici https://www.baeldung.com/java-completablefuture#Processing
la source
L'utilisation de Future décrite dans les réponses ci-dessus fait le travail, mais un peu moins significativement que f.get (), bloque le thread jusqu'à ce qu'il obtienne le résultat, ce qui viole la concurrence.
La meilleure solution est d'utiliser ListenableFuture de Guava. Un exemple :
la source
Avec de petites modifications à votre code, vous pouvez y parvenir de manière plus générique.
Solution :
Handler
thread dans l'interface utilisateur, qui s'appelleresponseHandler
Handler
partirLooper
de UI Thread.HandlerThread
, publier un message à ce sujetresponseHandler
handleMessgae
affiche uneToast
avec valeur reçue du message. Cet objet Message est générique et vous pouvez envoyer différents types d'attributs.Avec cette approche, vous pouvez envoyer plusieurs valeurs au thread d'interface utilisateur à différents moments. Vous pouvez exécuter (publier) de nombreux
Runnable
objets sur celui-ciHandlerThread
et chacunRunnable
peut définir une valeur dans l'Message
objet, qui peut être reçu par UI Thread.la source