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

Discussione: Dubbi su pool thread

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49

    Dubbi su pool thread

    Ciao a tutti !!!

    Vorrei capire meglio il funzionamento di un pool Thread; questo è un pezzo del mio codice:
    codice:
    public ArrayList<Frame> call() throws Exception 
    	{
    		int scan = 0;
    	    Socket clientSocket = null;
    	
    		while( scan < coreThreadDim )
    		{
    			 try
    			 {
    				
    				 clientSocket =server.accept();
    			 }
    			 catch(IOException e)
    			 {
    				 System.out.println("\nServer: problemi connessione nel pool di ricezione");
    			     System.exit(3);
    			 }
    		 listFrames.add( pool.submit(new ServerCThread(clientSocket)).get()); //qui si blocca!!!
    		 scan++;
    		}
    		
    		pool.shutdown();
    		
    	
        return listFrames;
    	}
    ho due dubbi....
    Quando chiamo get()... io di fatto attendo la fine del thread corrente...quindi sequenzializzo il pool o no???
    Poi pool.shutdown() cosa causa????(dove pool e' Executors.newFixedThreadPool(int nThread)....da quello che ho capito ...attende che tutti i thread finiscono e poi li termina...o succede qualcosaltro? ho anche un altro dubbio pool.shutdown()
    causa anche il blocco del programma fino a che il pool non viene terminato o no??



    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    shutdown() non termina i thread, ma evita che altri runnable/callable vengano aggiunti e quindi eseguiti lanciando un'eccezione nel caso venga chiamata una submit, per interrompere tutti i thread controllati dal pool si deve utilizzare shutdownNow().
    Anche se non chiami shutdown(), il programma non si chiuderà finché ci saranno dei thread non daemon in esecuzione.

    Cosa intendi con sequenzializzare il pool?


  3. #3
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    Ciao Grazie per aver risposto!!!

    Azz pensavo pausasse anche l'esecuzione fino al termine del pool:P
    Quindi per aspettare dovrei inserise una cosa del genere

    codice:
     while(!pool.isTerminated())
    	   {
    		   
    	   }
    Mi spiego meglio..il mio server ad ogni ciclo riceve dal client..4 richieste di connessione
    e vorrei che il server si ripredisponesse a riceve solo quando i precedenti quattro invii fossero terminati!

    Altrimenti per come è fatto il server.....si creerebbero mille processi in ricezione...(almeno credo:P...)

    ----

    listFrames.add( pool.submit(new ServerCThread(clientSocket)).get()); //qui si blocca!!!

    mi spiego...io non capisco qui come si evolve la cosa..sono indeciso tra due situazioni differenti:
    1) eseguo il while.... delego la creazione di un nuovo Frame a ServerCThread attendo
    che il sServerCthread restituisca il valore mediante get() (che ho letto essere un metodo bloccante)....quindi riavvio il while e ripeto il procedimento n volte.

    2) eseguo il while..delego a ServerCThread...prima che venga restituito qualkosa sto gia rieseguendo il while e delegando la creazione di un altro Frame a ServerCThread;


    Quale dei due scenari^^?:P
    il primo di fatto fa si che il server riceva i file uno dopo l'altro...o almeno credo?

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    Scusa se ti rompo ancora, gia che ci sono

    ho un problema con la connessione del programma sto ricontrollando e non capisco perchè
    se lo carico sia server che client su uno stesso pc funzionano e se invece li metto su due pc differendi appartenenti alla stessa rete non funzionano......eppure tutti gli altri programmi
    C/S vanno tranquillamente

    Secondo te da cosa puo dipendere?
    il client esce qui:
    codice:
      try
    	        {
    	        	sockClient = new Socket(serverAddres,port);
    	        	
                            outSock = sockClient.getOutputStream();
    	        	inSock = sockClient.getInputStream();
    	        	
                            dataOut = new DataOutputStream(outSock);
    	        }
    	        catch(IOException e)
    	        {
    	        	System.out.println("\nClient: impossibile stabilire la connessione");
    	        	continue;
    	        }
    praticamente subito...mentre se parte sullo stesso pc va benissimo...e come se non vedesse il server non capisco perchè visto che tutti gli altri programmi

    il server accetta la connessione cosi:
    codice:
     try
    		 {
    			 serverSocket = new ServerSocket(port);
    			 serverSocket.setReuseAddress(true);
    		 }
    		 catch(Exception e){System.out.println("\n Server: problemi con la socket.."); System.exit(1);}
    		 
    while(true)
    {                           
    
                                             try
    					    {
    					      clientSocket = serverSocket.accept();
    					      clientSocket.setSoTimeout(15000); 
    					    }
    					    catch(SocketTimeoutException et)
    					    {
    					     System.out.println("\nAttesa Accept Scaduta..");
    						 continue; // troppa attesa....riavvia il ciclo di ricezione.... 
    					    }
    					    catch(IOException e){ System.out.println("\nServer: problema con la connessione"); continue;}
    					    System.out.println("\nServer pronto per la ricezione....");

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    Per attendere il completamento dei thread devi utilizzare awaitTermination.

    listFrames.add( pool.submit(new ServerCThread(clientSocket)).get()); //qui si blocca!!!
    qui fai il submit del Callable e ti viene reso un oggetto Future il cui metodo get rende il risultato del Callable se è disponibile altrimenti attende la fine del task per poi continuare il normale flusso e quindi ritornare al controllo della condizione del while in questo caso.

    Riguardo al problema col client/server, che indirizzo ha nella rete il tuo pc server? che porta usi? Quale eccezione viene lanciata e da chi?

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    Grazie per la tua disponibilità

    try
    {
    sockClient = new Socket(serverAddres,port);
    sockClient.setReuseAddress(true);

    }
    catch(IOException e)
    {
    System.out.println("\nClient: problemi invio dimframes ed avvio connessione");
    continue;
    }

    il Client esce qui....quindi l'eccezione che si genera è IOException
    i parametri sono i seguenti:
    Client :
    indirizzo del server---192.168.1.2(il client è su 192.168.1.3)
    porta del server ----12345

    Server:
    in ascolto su porta 12345

    Fino ad ora tutti i programmi C/S funzionano tranquillamente questo è l'unico che non va.....
    e come se non vedesse il server non capisco perchè....
    mentre se avvio il tutto su la stessa macchina funziona benissimo....

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    nel catch fai stampare anche ex.getMessage() così abbiamo più informazione sul perché lanci l'eccezione

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    mi stampa: Connection refused: connect !!!

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    49
    ho disabilitato il firewall sul pc che usa il server ed ora vede il pc...pero per tutti gli altri programmi non c'è mai stato bisogno di questo...la connessione è sempre stata creata senza
    disabilitare il firewall....

    secondo te come mai?

  10. #10
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    51
    Sinceramente non saprei, che firewall hai?

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.