Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: [Java] Stream e Thread

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    31

    [Java] Stream e Thread

    Salve a tutti! E' il mio primo post, per cui mi presento. Mi chiamo Adriano e studio ingegneria informatica. Posto il codice per chiarezza, lo commenterò alla fine.
    codice:
    import java.io.*;
    import java.lang.*;
    import java.util.*;
    import java.net.*;
    
    //Devo fare in modo che partano due thread, uno per il cliente e uno per il taxi
    
    public class Gestore implements Runnable{
    	private LinkedList <Taxi> taxilist = new LinkedList <Taxi> ();
    	private ServerSocket ss;
    	private DataInputStream is;
    	private DataOutputStream os;
    	private ObjectInputStream ois;
    	private BufferedReader br;
    	private Gestore gest;
    	private Socket cs;
    	
    	public static void main(String args[]) throws IOException{
    		System.out.println("Sono il Server Gestore");
    		Gestore g = new Gestore();
    		g.init();
    	}
    	
    	public void init(){
    		try{
    			ss = new ServerSocket(50000);
    			while(true){
    				cs = ss.accept();
    				os = new DataOutputStream(cs.getOutputStream());
    				is = new DataInputStream(cs.getInputStream());
    				br = new BufferedReader(new InputStreamReader(cs.getInputStream()));
    				System.out.println("Identificazione In corso");
    				boolean id;
    				id = is.readBoolean();//se leggo true è un taxi, se leggo false è un cliente
    				Thread.sleep(5000);
    				if(id == true){
    					gest = new Gestore();
    					Thread tg = new Thread(gest);
    					tg.start();
    				}
    			}
    		}
    		catch(IOException e) {System.out.println("Error "+e);}
    		catch(InterruptedException e) {System.out.println("Error "+e);}
    	}
    	
    	public void run(){
    		//thread taxi
    		try{
    			System.out.println("Benvenuto Taxi");
    			//Qui si blocca, dice che lo stream is è null
    			//se copio il codice dentro l'if invece che far partire il thread funziona.
    			int x = is.readInt();
    			int y = is.readInt();
    			boolean libero = is.readBoolean();
    			int tid = taxilist.size()+1;
    			os.writeInt(tid);
    			Posizione pos = new Posizione(x,y);
    			Taxi taxiapp = new Taxi(pos,libero,tid);
    			taxilist.add(taxiapp);
    			os.writeBoolean(true);
    		}
    		catch(IOException e){System.out.println("Errorrrrrrrr");}
    	}
    }
    Dunque questo server deve gestire le richieste di due client: taxi e cliente. Per ora ho implementato solo la parte relativa al taxi. L'errore è alla riga 53 ovvero
    codice:
    int x = is.readInt();
    A runtime ricevo una eccezzione di tipo NullPointerException quindi è come se lo stream is sia null. Dentro il metodo init() gli stream funzionano perfettamente, quindi il problema è evidentemente del run(). Spero di essere stato chiaro e vi ringrazio per l'attenzione

  2. #2
    Ciao, il problema potrebbe essere legato al fatto che nel if crei un nuovo Gestore, che però non viene inizializzato con la funzione init(), per cui è probabile che lo stream non sia inizializzato per quel gestore.
    Spero di essermi spiegato.
    Materiale Programmazione - code-power.blogspot.com

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Stream e Thread

    Originariamente inviato da Xanakro
    A runtime ricevo una eccezzione di tipo NullPointerException quindi è come se lo stream is sia null. Dentro il metodo init() gli stream funzionano perfettamente, quindi il problema è evidentemente del run().
    Nel main() fai:

    Gestore g = new Gestore();

    E questo è ok per avere la istanza su cui invocare init(). Ma nel init() ad un certo punto per creare il thread fai:

    gest = new Gestore();
    Thread tg = new Thread(gest);


    Hai istanziato un nuovo oggetto Gestore e in questo non vengono inizializzati i vari stream.

    Il mio consiglio è quello di separare meglio le cose: cioè la parte main+init dalla parte che definisce il "lavoro" del thread.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Si, però creando un nuovo gestore, viene creato un nuovo oggetto, per cui chiamando il metodo run() verrà utilizzato l'is di quel oggetto.
    In pratica non viene utilizzato l'InputStream inizializzato nel metodo init().
    Materiale Programmazione - code-power.blogspot.com

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da serioja90
    [...]per cui chiamando il metodo run() [...]
    Il metodo run() non deve MAI essere chiamato direttamente dal programmatore.
    Il programmatore deve limitarsi a chiamare il metodo start(). Sarà la JVM ad invocare il metodo run().


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Potresti risolvere il problema passando al nuovo Gestore gli stream inizializzati.
    Materiale Programmazione - code-power.blogspot.com

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    31
    Grazie per le risposte!
    Quindi se ho ben capito secondo voi conviene creare una nuova classe con solo il metodo run()?
    Mi sorge un dubbio. Dato che in init() ho
    codice:
    cs = ss.accept();
    come faccio a prendere la socket nel run della nuova classe?

    @leleft: sisi chiamo il metodo start() ho scritto male chiedo venia

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Xanakro
    Grazie per le risposte!
    Quindi se ho ben capito secondo voi conviene creare una nuova classe con solo il metodo run()?
    Mi sorge un dubbio. Dato che in init() ho
    codice:
    cs = ss.accept();
    come faccio a prendere la socket nel run della nuova classe?
    Gliela passi come parametro al costruttore, ad esempio...

    @leleft: sisi chiamo il metodo start() ho scritto male chiedo venia
    Sì, il mio intervento era in risposta a serioja90

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    31
    Perfetto! Grazie mille a tutti per l'aiuto

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Xanakro
    Quindi se ho ben capito secondo voi conviene creare una nuova classe con solo il metodo run()?
    Mi sorge un dubbio. Dato che in init() ho
    codice:
    cs = ss.accept();
    come faccio a prendere la socket nel run della nuova classe?
    Da quanto ho capito hai questo "server" che deve gestire 2 tipi di "client": un "taxi" o un "cliente".

    Bene potresti avere un tuo GestoreRunnable che nel run() si "smazza" la cosa andando a vedere quel boolean e facendo cose diverse a seconda del valore.
    Oppure avere 2 runnable: GestoreRunnableTaxi e GestoreRunnableCliente. Chiaramente la logica di riconoscimento la fai "a monte" (concettualmente come hai già fatto).
    Scegli tu.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.