Qual è il modo migliore per passare le informazioni tra i thread?

Voglio ascoltare un server mentre il mio programma sta facendo altre cose, quando un messaggio viene ricevuto dal server, voglio interpretarlo.

Conosco il threading ma non sono completamente sicuro di come funziona. Se ho un thread in ascolto per il server, come posso passare quei dati al thread principale per l’interpretazione? Qual è il modo migliore per il thread principale di inviare dati al server? Qual è l’uso del modificatore sincronizzato?

Se ho un thread in ascolto per il server, come posso passare quei dati al thread principale per l’interpretazione? Qual è il modo migliore per il thread principale di inviare dati al server?

Userei un BlockingQueue per questo. Si definisce un singolo BlockingQueue come LinkedBlockingQueue . La class del listener chiama quindi queue.take() che attenderà che il server chiami queue.put() . Lascia tutte le sincronizzazioni, le attese, le notifiche, ecc. Alla class Java invece del proprio codice.

Qual è l’uso del modificatore sincronizzato?

Farei delle letture per capire di più su questo. Questo non è il tipo di cosa a cui si può rispondere in una risposta SO corta. Il tutorial sulla concorrenza Java è un buon punto di partenza.

Se si desidera la comunicazione sincrona tra un thread principale e un thread di elaborazione, è ansible utilizzare un SynchronousQueue .

L’idea è che il thread principale trasmetta i dati al thread di elaborazione chiamando put() , e il thread di elaborazione chiama take() . Entrambe sono operazioni di blocco.

Si noti che se si desidera restituire un risultato, le cose potrebbero diventare un po ‘più complesse poiché il thread principale deve sapere quando il risultato è pronto. Un CountDownLatch è un buon primitivo per questo. Puoi fare qualcosa di simile.

Per prima cosa definiamo una struttura dati per passare i dati:

 public class MethodCall { public final String methodName; public final Object[] args; public final CountDownLatch resultReady; public Object result; public MethodCall(String methodName, Object[] args) { this.methodName = methodName; this.args = args; this.resultReady = new CountDownLatch(1); } public void setResult(Object result) { this.result = result; resultReady.countDown(); } public Object getResult() throws InterruptedException { resultReady.await(); return result; } } 

Definire la coda per passare i dati, visibile da entrambi i thread:

 public SynchronousQueue methodCalls = new SynchronousQueue(); 

Per effettuare una chiamata dal thread principale al thread di elaborazione e attendere il risultato:

 MethodCall call = new MethodCall(methodName, args); methodCalls.put(call); Object result = call.getResult(); 

Nel thread di elaborazione, ad esempio in un metodo run() , puoi quindi eseguire:

 for (;;) { MethodCall call = methodCalls.take(); Object res = processStuff(call.methodName, call.args); call.setResult(res); } 

Dove processStuff implementa la tua logica. Ovviamente dovresti occuparti anche delle eccezioni, occuparti dei casi di uscita, cambiare MethodCall per avere cose più specifiche di methodName e args e un ritorno Object , ecc.

Passare attraverso alcuni tutorial per la comprensione di thread Java.

http://www.journaldev.com/1079/java-thread-tutorial

Il tuo problema sembra essere un modello produttore-consumatore, puoi usare BlockingQueue per raggiungere facilmente questa attività.

Java Blocking Queue