2013-04-07 78 views
8

Sto scrivendo una piccola app e ora ho scoperto un problema. Ho bisogno di chiamare uno (più tardi due) metodo (questo metodo carica qualcosa e restituisce il risultato) senza rallentare nella finestra dell'app.Metodo semplice per chiamare il metodo nella nuova discussione

Ho trovato classi come Executor o Callable, ma non capisco come lavorare con quelle.

Potete per favore pubblicare qualsiasi soluzione, che mi aiuti?

Grazie per tutti i consigli.

Modifica: Il metodo DEVE restituire il risultato. Questo risultato dipende dai parametri. Qualcosa di simile a questo:

public static HtmlPage getPage(String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
     return webClient.getPage(page); 
} 

Questo metodo funziona circa 8-10 secondi. Dopo aver eseguito questo metodo, il thread può essere fermato. Ma ho bisogno di chiamare i metodi ogni 2 minuti.

Edit: Ho modificato il codice con questo:

public static HtmlPage getPage(final String page) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
    Thread thread = new Thread() { 
     public void run() { 
      try { 
       loadedPage = webClient.getPage(page); 
      } catch (FailingHttpStatusCodeException | IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    thread.start(); 
    try { 
     return loadedPage; 
    } catch (Exception e) { 
     return null; 
    } 

} 

Con questo codice ottengo di nuovo errore (anche se ho messo return null fuori cattura blocco).

+1

[ 'Executor'] (http://docs.oracle. it/javase/7/docs/api/java/util/concurrent/Executor.html) e ['ExecutorService'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent /ExecutorService.html) hanno degli esempi in javadoc. E [un argomento] (http://docs.oracle.com/javase/tutorial/essential/concurrency/exinter.html) sul thread * concurrency * nel tutorial ufficiale. Ecco dove comincio. Dovresti fare una nuova domanda se non capisci qualcosa * specifico * in quei materiali, o se sei bloccato avendo usato le informazioni in loro. – millimoose

+0

Ho visto gli esempi, non posso realizzare quello che voglio. – Sk1X1

+1

I * penso * cosa stai cercando ['ExecutorService.submit()'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#submit (java.util.concurrent.Callable)) con un 'Callable ', quindi concentrarsi sulla documentazione per tali classi e metodi/metodi correlati. 'submit()' dovrebbe restituire un 'Future ' che ti permetterà di fare qualcosa (come aggiornare l'interfaccia utente) quando il risultato è disponibile. – millimoose

risposta

22

In primo luogo, vorrei raccomandare guardando il Java Thread Documentation.

Con una discussione, è possibile passare un tipo di interfaccia denominata Runnable. La documentazione può essere trovata here. Un runnable è un oggetto che ha un metodo run. Quando si avvia una discussione, chiamerà qualsiasi codice presente nel metodo run di questo oggetto eseguibile. Per esempio:

Thread t = new Thread(new Runnable() { 
     @Override 
     public void run() { 
       // Insert some method call here. 
     } 
}); 

Ora, che cosa questo significa è quando si chiama t.start(), verrà eseguito qualsiasi codice avete bisogno di senza ritardo il thread principale. Si chiama chiamata al metodo Asynchronous, il che significa che viene eseguito in parallelo a qualsiasi altro thread aperto, come il thread main. :)

+0

Ho provato qualcosa del genere, ma non ha funzionato (maggiori informazioni nella prossima risposta) – Sk1X1

+0

come passare argomento al metodo chiamante –

20

Dal momento che Java 8 è possibile utilizzare una formula più breve:

new Thread(() -> { 
    // Insert some method call here. 
}).start(); 

Aggiornamento: Inoltre, è possibile utilizzare il metodo di riferimento:

class Example { 

    public static void main(String[] args){ 
     new Thread(Example::someMethod).start(); 
    } 

    public static void someMethod(){ 
     // Insert some code here 
    } 

} 

Siete in grado di usarlo quando il la lista degli argomenti è la stessa del richiesto @FunctionalInterface, ad es Runnable o Callable.

Altre informazioni: Platform.runLater and Task in JavaFX, Method References.

1

In Java 8 Se non ci sono parametri richiesti è possibile utilizzare:

new Thread(MyClass::doWork).start(); 

o in caso di parametri:

new Thread(() -> doWork(someParam)) 
+0

Questo è relativo. I parametri sono nascosti e dipende dai parametri di input dell'interfaccia. Quando scrivi 'new Thread (MyClass :: doWork) .start();' potresti anche scrivere 'new Thread (() -> doWork())' Per Runabble non ci sono parametri di input. Ma se hai bisogno di input da una variabile che è fuori dalla chiusura, allora sì, puoi fare la seconda strada. –

Problemi correlati