113 votes

Valeur renvoyée par Thread

J'ai une méthode avec un HandlerThread . Une valeur est modifiée dans le Thread et j'aimerais la renvoyer à la méthode test() 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();
}

116voto

Johan Sjöberg Points 20759

Habituellement, vous le feriez quelque chose comme ça

  public class Foo implements Runnable {
     private volatile int value;

     @Override
     public void run() {
        value = 2;
     }

     public int getValue() {
         return value;
     }
 }

Ensuite, vous pouvez créer le thread et récupérer la valeur (étant donné que la valeur a été définie)

 Foo foo = new Foo();
Thread thread = new Thread(foo);
thread.start();
thread.join();
int value = foo.getValue();

tl;dr un thread ne peut pas renvoyer de valeur (du moins pas sans mécanisme de rappel). Vous devez référencer un thread comme une classe ordinaire et demander la valeur.

32voto

Detheroc Points 881

Ce que vous recherchez est probablement l' Callable<V> à la place de Runnable , et récupérer la valeur avec un objet Future<V> , qui vous permet également d'attendre que la valeur a été calculé. Vous pouvez y parvenir avec un ExecutorService , que vous pouvez obtenir à partir de Executors.newSingleThreadExecutor() .

 public void test() {
    int x;
    ExecutorService es = Executors.newSingleThreadExecutor();
    Future<Integer> result = es.submit(new Callable<Integer>() {
        public Integer call() throws Exception {
            // the other thread
            return 2;
        }
    });
    try {
        x = result.get();
    } catch (Exception e) {
        // failed
    }
    es.shutdown();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X