2012-12-28 22 views
10

Jestem naprawdę noob w java, więc oto mój problem. Mam zwrócony ciąg znaków:Oczekiwanie na wartość zwrotu metody

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

Problem polega na tym, że kod return string powrót null, ponieważ metoda getResponse() zwraca parę sekund, aby uzyskać odpowiedź. Dowolny sposób oczekiwania na getResponse(), aby zakończyć i tylko wtedy zwrócić String?

+1

co robi metoda 'getResponse()'? Opublikuj kod. –

+2

Zmieniłbym metodę getResponse tak, aby nie była zwracana, dopóki nie otrzyma odpowiedzi. –

+0

Metoda getReponse() po prostu wykonuje żądanie GET, jeśli serwer odpowie, że nie jest gotowy, czeka 10 sekund i wykonuje kolejne żądanie GET. – artouiros

Odpowiedz

14

Możesz spróbować użyć obiektów Future i Callable zadań. Są one przydatne, gdy chcesz uruchomić jakieś zadanie w innym wątku i później użyć zwróconych danych. Aby pobrać wyniki operacji, a zadanie nie zostało zakończone, operacja po prostu blokuje i czeka, aż wszystko będzie gotowe do kontynuowania. Tutaj można znaleźć sposób ich użycia: http://www.javacodegeeks.com/2011/09/java-concurrency-tutorial-callable.html

Prosty przykład:

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

Gdzieś w kodzie:

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

Użyj wynik:

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

dzięki, dokładnie to, czego potrzebuję. – artouiros

+0

Nie ma za co :) –

0

Należy przy użyciu nici pool lub FutureTask w innym wątku podobnym do tego:

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); 
}