2012-12-28 17 views
10

Sono davvero un noob in java, quindi ecco il mio problema. Ho uno String restituito:In attesa del valore di ritorno del metodo

public static String pushToServer(String data){ 
    //some code here 
      Thread.sleep(10000); 
      getResponse(); //accesing a public void method 
    return string; 
    } 

Il problema è, che return string codice di ritorno null, metodo perché getResponse() richiede un paio di secondi per ottenere la risposta. C'è un modo per aspettare getResponse() per finire e solo poi restituire String?

+1

cosa fa il metodo 'getResponse()'? Pubblica il codice per questo. –

+2

Cambiare getResponse in modo che non ritorni finché non ha ottenuto la risposta. –

+0

Il metodo getReponse() esegue solo una richiesta GET, se il server non risponde, attende 10 secondi e fa un'altra richiesta GET. – artouiros

risposta

14

È possibile provare a utilizzare gli oggetti Future e le attività Callable. Sono abbastanza utili quando si desidera eseguire alcune attività in un altro thread e utilizzare i dati restituiti in un secondo momento. Quando si desidera recuperare i risultati dell'operazione e l'attività non è terminata, l'operazione bloccherà semplicemente e attenderà che tutto sia pronto per procedere. Qui si possono trovare come usarli: http://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-callable.html

semplice esempio:

public class YourTask implements Callable { 
    public String call() throws Exception { 
     /* Do what you want to do */ 
    } 
} 

Da qualche parte nel codice:

Future future = yourThreadPool.submit(new YourTask()); 

Utilizzare il risultato:

String returnString = future.get(15, TimeUnit.SECONDS); 
+0

grazie, esattamente quello di cui ho bisogno. – artouiros

+0

Prego :) –

0

Si dovrebbe con filo pool o FutureTask in un'altra discussione come questa:

public static String pushToServer(String data){ 
    Future<V> f = getResponse(data) 
    //waiting 10 second for the result at most 
    return f.get(10,TimeUnit.SECONDS); 
} 


private Future<V> getResponse(data){ 
    return athreadPool.submit(a task); 
} 
Problemi correlati