Controllo thread

di il
50 risposte

50 Risposte - Pagina 2

  • Re: Controllo thread

    KuroKami69 ha scritto:


    ok stavo cercando di fare la parte di attesa del minatore, quindi gli ho calato un this.wait(n);
    però per funzionare ho dovuto buttarlo dentro un synchronized.
    Il wait NON serve per fare una "attesa" così .. tanto per far passare del tempo tenendo un thread in sospeso.
    Il wait, insieme ai notify()/notifyAll(), serve per gestire la condition queue intrinseca degli oggetti. Che è tutto un altro discorso.

    Per mettere in sospensione il thread corrente si usa Thread.sleep(millisecondi)
  • Re: Controllo thread

    andbin ha scritto:



    Per mettere in sospensione il thread corrente si usa Thread.sleep(millisecondi)
    ho usato il TimeUnit.SECONDS.sleep(ext);

    comunque, grossomodo l'esercitazione l'ho finita. ma sono tremendamente insicuro su 2 cose:
    la classe message, che dovrebbe gestire i flussi, e il fatto che creo l'oggetto message sia nella miniera, per mandare un wait in caso ci sono 3 minatori tutti occupati, passandogli il socket, e poi creo un secondo oggetto message su miner a cui passo il socket passato al costruttore del miner. non vorrei fosse sbagliato. voglio dire, se creo l'oggetto message dentro alla miniera, e leggo i flussi, e poi lo creo dentro al minatore, e rileggo i flussi dallo stesso socket cui già li ho letti prima, in teoria dovrebbe funzionare giusto?
    incollo il codice completo, e se possibile, vorrei un'opinione, magari anche dirmi se questi miei 2 dubbi sono fondati.
    miniera
    
    package Miniera;
    
    import java.io.IOException;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     *
     * @author Dark
     */
    public class Mine 
    {
        private static Thread[] threadArray = new Thread[3];
        
        public static void main (String[] args) 
        {
            System.out.println("MINIERA");
            System.out.println("In attesa di richieste da parte del fabbro");
            
            //variabile che mi tiene conto dei minatori attivi, max 3
            ServerSocket server;
            Socket socket;
    
            try
            {
                //metto il server in ascolto sulla porta 41000
                server = new ServerSocket(41000);
                
                //lo metto in attesa perpetua
                while (true)
                {
                    socket = server.accept();
                    minerDispatch(socket);
                }
            }
            catch (IOException ioe)
            {
                System.out.println(ioe.getMessage());
            }   
        }
        
        //metodo che crea e verifica lo stato dei minatori tramite un array
        private static void minerDispatch(Socket socket) throws IOException
        {
            Message m = new Message (socket);
            for(int i = 0; i < 3; i++)
            {
                if(threadArray[i] == null)
                {
                    threadArray[i] = new Thread(new Miner(socket));
                    threadArray[i].start();
                    i = 3;
                }
                else
                {  
                    if(threadArray[i].getState() == Thread.State.TERMINATED)
                    {
                        threadArray[i].interrupt();
                        threadArray[i] = new Thread(new Miner(socket));
                        threadArray[i].start();
                        i = 3;
                    }
                    else if (i == 3)
                        m.sendResponse(i);
                }
            }
        }
    }
    minatore
    
    package Miniera;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.util.Random;
    import java.util.concurrent.TimeUnit;
    
    
    
    /**
     *
     * @author Dark
     */
    public class Miner implements Runnable
    {
        private BufferedReader reader;
        private Socket socket;
        private Message m;
        private boolean running = true;
        private Random rnd = new Random();
        private PrintStream writer;
        
        public Miner(Socket socket)
        {
            this.socket = socket;
        }
        
        @Override
        public void run ()
        {
            synchronized(this)
            {
                while(running)
                {
                    try 
                    {
                        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                        writer = new PrintStream(socket.getOutputStream());
    
                        m = new Message(socket);
    
                        if(m.examineText() != true)
                            running = false;
                        else
                        {
                            int qty = m.getQty();
                            int extracted;
                            for(extracted = 0; extracted < qty;)
                            {
                                int ext = extract();
                                if ((qty - extracted) < ext)
                                {
                                    extracted = qty;
                                    m.sendResponse((qty - extracted));
                                    running = false;
                                }
                                extracted = extracted + ext;
                                m.sendResponse(ext);
                                TimeUnit.SECONDS.sleep(ext);
                            }
                        }
                    } 
                    catch (IOException | InterruptedException ioe) 
                    {
                        System.out.println(ioe.getMessage());
                    }
                }
            }
        }
        
        private int extract()
        {
            return rnd.nextInt(5)+1;
        }
    }
    fabbro
    
    package Miniera;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Random;
    
    /**
     *
     * @author Dark
     */
    public class Blacksmith 
    {
        public static void main (String[] args)
        {
            Random rnd = new Random();
            Message m;
            Socket socket;
    
            try
            {
                socket = new Socket ("127.0.0.1", 41000);
                m = new Message(socket);
                
                System.out.println("collegamento stabilito");
    
                m.sendRequest(rnd.nextInt(100));
                
                m.recivedRequest();
                
                socket.close();
            }
            catch (IOException ioe)
            {
                System.out.println(ioe.getMessage());
            }
        }
    }
    per finire message
    
    package Miniera;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    
    
    /**
     *
     * @author Kuro
     */
    public class Message
    {
        private String text;
        private String command;
        private int qty;
        private PrintStream writer;
        private BufferedReader reader;
        private Socket socket;
        
        public Message (Socket socket)
        {
            this.socket = socket;
        }
        
        
        
        private void splitText() throws IOException
        {
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintStream(socket.getOutputStream()); 
            
            String[] examine = text.split(":");
            command = examine[0];
            qty = Integer.parseInt(examine[1]);
        }
        
        /**
         *
         * @return
         * @throws IOException
         */
        public boolean examineText() throws IOException
        {
            splitText();
            if(command.equals("GET"))
                return true;
            else
                return false;
        }
        
        public void sendRequest(int quantity)
        {
            writer.println("GET:" + quantity);
        }
        
        public void sendResponse(int i)
        {
            if(i < 3)
                writer.println("WAIT");
            else if (command.equals("GET"))
                writer.println("PUT:" + i);
        }
        
        public void recivedRequest() throws IOException
        {
            writer.println(reader.readLine());
        }
        
        public int getQty()
        {
            return qty;
        }
    }
    premetto 2 cose:
    1) devo sistemare gli import, ma solo a progetto completo
    2) la classe message probabilmente risulta molto confusionaria. lo so, sto cercando di abituarmi a programmare come si deve dividendo il problema il più possibile, e non essendo ancora abituato a questa mentalità, e anche non sapendo benissimo come funziona il discorso socket/thread, probabilmente risulta un attimo incasinato, ma volevo il vostro parere proprio per poter far un po' di luce
    sostanzialmente vorrei che la mia classe message facesse:
    1) si occupasse di mandare la richiesta del fabbro alla miniera
    2) si occupasse di risponde al fabbro di un eventuale carenza di minatori disponibili
    3) si occupasse di mandare al fabbro la quantità di materiale estratto dal minatore
    mi è stato consigliato di salvarmi il command (put, get, wait) e le varie quantità, per cui ho fatto lo splitText anche se con il solo scopo di verificare che il messaggio del fabbro contenesse GET o meno. potrei farlo meglio, ma prima di rimetterci mano, vorrei appunto il vostro parere
  • Re: Controllo thread

    KuroKami69 ha scritto:


    ho usato il TimeUnit.SECONDS.sleep(ext);
    Sì corretto. TimeUnit (da Java 5) offre l'equivalente della sleep "diretta" sul Thread. Semplicemente è "girato" al contrario. Ovvero ci sono delle costanti per le varie unità di tempo e la sleep di TimeUnit semplicemente calcola milli/nano-secondi da passare al Thread.sleep.

    KuroKami69 ha scritto:


    comunque, grossomodo l'esercitazione l'ho finita. ma sono tremendamente insicuro su 2 cose:
    Ci sono purtroppo svariate cose dubbie e che non vanno ...

    Classe Mine:

    - il interrupt() non serve a nulla. Se il thread è in stato TERMINATED, il run() ha già finito e non esiste più il "flusso" di esecuzione a sé stante. Quindi non c'è proprio nulla da interrompere!
    - i due casi, se null oppure terminated devono fare sostanzialmente la stessa cosa, quindi si possono benissimo mettere in "or" con un solo if.
    - mettere i a 3 per far terminare il ciclo è molto "becero". Bastava un break; o visto che dopo il for non c'è nulla, anche un return; sarebbe ok.
    - nel main il catch di IOException è a "monte" del while. Quindi una eccezione scaturita dalla comunicazione con un client, fa terminare l'intero server. Può essere una scelta ... ma si può fare diversamente.


    Classe Miner:

    - il synchronized(this) non serve assolutamente a nulla.
    - hai creato un BufferedReader e PrintStream che poi non usi.


    Classe Message:

    Questa è la peggiore. Innanzitutto non c'è davvero necessità della Message. Si poteva fare tutto in Miner.
    E comunque:
    - la creazione di BufferedReader/PrintStream la fai in splitText, quindi è un obbligo chiamare prima questo metodo (e solo una volta!). NO, è troppo "critica" questa cosa. Quelle inizializzazioni dovrebbero essere nel costruttore.
    - perché quel if(i < 3) ? Cioè ho capito, il 3 è legato al numero max di thread. Ma perché Message dovrebbe "sapere" di quanti thread ci possono essere?? Appunto, NON lo deve sapere!
  • Re: Controllo thread

    andbin ha scritto:


    KuroKami69 ha scritto:


    ho usato il TimeUnit.SECONDS.sleep(ext);
    Sì corretto. TimeUnit (da Java 5) offre l'equivalente della sleep "diretta" sul Thread. Semplicemente è "girato" al contrario. Ovvero ci sono delle costanti per le varie unità di tempo e la sleep di TimeUnit semplicemente calcola milli/nano-secondi da passare al Thread.sleep.

    KuroKami69 ha scritto:


    comunque, grossomodo l'esercitazione l'ho finita. ma sono tremendamente insicuro su 2 cose:
    Ci sono purtroppo svariate cose dubbie e che non vanno ...

    Classe Mine:

    - il interrupt() non serve a nulla. Se il thread è in stato TERMINATED, il run() ha già finito e non esiste più il "flusso" di esecuzione a sé stante. Quindi non c'è proprio nulla da interrompere!
    - i due casi, se null oppure terminated devono fare sostanzialmente la stessa cosa, quindi si possono benissimo mettere in "or" con un solo if.
    - mettere i a 3 per far terminare il ciclo è molto "becero". Bastava un break; o visto che dopo il for non c'è nulla, anche un return; sarebbe ok.
    - nel main il catch di IOException è a "monte" del while. Quindi una eccezione scaturita dalla comunicazione con un client, fa terminare l'intero server. Può essere una scelta ... ma si può fare diversamente.


    Classe Miner:

    - il synchronized(this) non serve assolutamente a nulla.
    - hai creato un BufferedReader e PrintStream che poi non usi.


    Classe Message:

    Questa è la peggiore. Innanzitutto non c'è davvero necessità della Message. Si poteva fare tutto in Miner.
    E comunque:
    - la creazione di BufferedReader/PrintStream la fai in splitText, quindi è un obbligo chiamare prima questo metodo (e solo una volta!). NO, è troppo "critica" questa cosa. Quelle inizializzazioni dovrebbero essere nel costruttore.
    - perché quel if(i < 3) ? Cioè ho capito, il 3 è legato al numero max di thread. Ma perché Message dovrebbe "sapere" di quanti thread ci possono essere?? Appunto, NON lo deve sapere!
    grazie mille
    allora, il syncronized lo avevo messo per far funzionare un inutile this.wait(); e poi l'ho dimenticato la, ci sta.
    si ho creato il buffered e il print, perché prima facevo tutto su miner, ma come ho detto, queste, come gli import, sono cose che sistemo alla fine

    per quanto riguarda la classe mine, avevo messo un break nella prima versione del progetto, ma non mi esaltava troppo, ad ogni modo lo rimetto, è più elegante. e l'interrupt() pensavo servisse a fermare un thread. forse ho capito male. ok lo tolgo. accorpo i 2 casi da te elencati. non ho fatto una classe a parte per la gestione della pool, ma solo un metodo separato, non vorrei fare troppe classi. per quanto riguarda il catch, al momento siamo abituati così, fare diversamente, sempre se per diversamente intendi fare un sempliece throws exception dopo la firma del metodo, complicherebbe le cose, almeno a me.

    per la classe message. è vero, sarebbe inutile, però, mettendo caso che un giorno, magari il prossimo anno, il progetto subirà un'evoluzione, allora ho già la classe pronta a cui basta modificare poco o niente.
    le inizializzazioni all'inizio le avevo nel costruttore, ma come ho detto, ho le idee davvero confuse riguardo alla gestione del socket.
    per quel if (i < 3), l'ho messo perché ho messo nello stesso metodo sia la risposta del miner quando estrae, sia quella della miniera in caso di full pool. ma ovviamente è sbagliato, dovrebbero esserci metodi separati.
    ora sistemo tutto, grazie
    quello che ancora non ho capito però, è come funziona il socket. nel senso. io apro un socket con il server, e quello ne apre uno con il client. quindi il flusso di dati passa per questi socket.
    ora se io leggo il flusso, poi quello scompare? nel senso, in laboratorio giovedì passato il reader a un metodo, nel miner, e sempre nel miner, poco dopo, usavo il reader, che però non trovava nulla da leggere. cosa ho sbagliato? non so se mi son spiegato bene
  • Re: Controllo thread

    
    package Miniera;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    
    
    /**
     *
     * @author Kuro
     */
    public class Message
    {
        private String command;
        private int qty;
        private PrintStream writer;
        private BufferedReader reader;
        private Socket socket;
        
        public Message (Socket socket) throws IOException
        {
            this.socket = socket;
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new PrintStream(socket.getOutputStream());
            splitText();
        }
    
        private void splitText() throws IOException
        {
            String[] examine = reader.readLine().split(":");
            command = examine[0];
            qty = Integer.parseInt(examine[1]);
        }
        
        public boolean examineText()
        {
            if(command.equals("GET"))
                return true;
            else
                return false;
        }
        
        public void sendRequest(int quantity)
        {
            writer.println("GET:" + quantity);
        }
        
        public void sendMatsResponse(int i)
        {
            writer.println("PUT:" + i);
        }
        
        public void sendWaitResponse()
        {
            writer.println("WAIT");
        }
        
        public void recivedRequest() throws IOException
        {
            while(reader.readLine() != null)
                writer.println(reader.readLine());
        }
        
        public int getQty()
        {
            return qty;
        }
    }
    ho dato una leggera sistemata alla classe message, ma non son ancora troppo convinto. il recivedRequest() non mi ispita con il while dentro, ma dopotutto serve... credo
  • Re: Controllo thread

    Va bene, la classe message mi da seri problemi, quindi la tolgo definitivamente. non riesco a farla funzionare come vorrei. però mi secca non poco fare sulle 3 classi il writer e il reader
    in verità ho fatto come mi hai suggerito, ossia di mettere l'inizializzazione del writer e del reader nel costruttore. però la mi crea problemi, non riesce a farcela
  • Re: Controllo thread

    Ah, quando si usano i socket, dopo una scrittura (o più scritture se rappresentano un blocco logico di dati), è bene fare s-e-m-p-r-e un flush(). Nel tuo codice non ne ho visto manco uno ...
  • Re: Controllo thread

    Porca miseria è vero. Lo abbiamo visto nella prima lezione. Sono proprio una testa vuota. Grazie mille

    ciononostante ancora non riesce a inizializzare buffer e writer. per quale immane motivo??
    più che altro penso che sia perché il reader non legge un tubo. almeno, a inizializzare buffer e writer li inizializza, poi non esegue il reader.readLine() mmh
    ho capito. sostanzialmente con il mio metodo attuale, quando passo il socket, dentro non essendo nulla, il reader si impalla. così quando vado a chiamare i metodi poi si incasina. quindi ho pensato:
    posso fare un metodo in cui inizializzo i flussi. poi ci passo un numero e il comando. ma ha poco senso perché ci ha detto di fare GET:x PUT:x apposta per farci lavorare sulle stringhe, quindi io devo inviare la stringa. potrei quindi passargliela come parametro ai metodi, ma mi sembra brutto...
    vabbeh domani e lunedì ci ragiono con calma
  • Re: Controllo thread

    public class Miner implements Runnable {
        private Socket socket;
        private BufferedReader reader;
        private PrintStream writer;
    
        public Miner(Socket socket) throws IOException
        {
            this.socket = socket;
            InputStream is;
            OutputStream os;
    
            try {
                is = socket.getInputStream();
                os = socket.getOutputStream();
            } catch (IOException e) {
                try { socket.close(); } catch (IOException ex) {}
                throw e;
            }
    
            reader = new BufferedReader(new InputStreamReader(is));
            writer = new PrintStream(os);
        }
    
        @Override
        public void run ()
        {
            try {
                try {
                    comunicazione();
                } finally {
                    socket.close();
                }
            } catch (IOException e) {
                // ......
            }
        }
    
        private void comunicazione() throws IOException {
            boolean running = true;
    
            while (running) {
                // ..... comunicazione con il client
            }
        }
    }
    Poi nel while fai letture/scritture seguendo il "protocollo" di comunicazione che hai descritto. Assicurando un flush dopo le scritture.
  • Re: Controllo thread

    Perchè nel miner e non nel message?
  • Re: Controllo thread

    KuroKami69 ha scritto:


    Perchè nel miner e non nel message?
    Perché Message non mi pare poi molto utile. Almeno per iniziare puoi fare tutto nel Miner.

    Tra l'altro, ho corretto il codice che ho postato, rileggilo. Il socket.close() va fatto sempre e comunque, quindi ho ristrutturato delegando il solo lavoro della comunicazione con il client in un metodo private.
  • Re: Controllo thread

    Ho capito, ti ringrazio, poi appena son a casa controllo bene. Comunque il punto della classe message è che se un giornovolesso espandere il progetto, allora avrei una classe pronta e funzionante a cui basta solo fare poche modifiche
  • Re: Controllo thread

    Ok il tuo codice è un pochino macchinoso, devo vedermelo dal fisso, che ora son fuori. Sostanzialmente dentro al run devo solo fare l'exctract e spedire il messaggio al client. E leggere il messaggio del fabbro
    perché nel run ci hai messo 2 try?
  • Re: Controllo thread

    Ok allora, 2 cose
    la prima, è che ti sono grato per l'aiuto che mi dai, ma vorrei consegnare una soluzione scritta da me, anche a costo di prendere qualche voto in meno perché non è ottimizzata/corretta etc. quindi non userò quel codice che mi hai messo, non sono a tale livello, quindi non posso usarlo in qualcosa che viene valutato. i consigli sono ben accetti, e se son del livello adeguato, posso anche lavorarci sopra. un aiuto nel capire perché qualcosa non va, cosa sbaglio, ci sta, ma per quanto ti sia grato, non voglio usare codice altrui per questo lavoro. ci devo arrivare io.

    detto questo la seconda cosa.
    non son in grado di gestire la classe message a dovere, ho già spiegato perché volevo usarla, ma ci ho rinunciato.
    ho quindi riscritto il codice in questo modo (non fate caso ai system.out.println di debug), che però non funziona.
    presenta i seguenti problemi:
    1) quando nella classe miner faccio prima il writer.println("PUT:" + ext); e il flush, e poi il timeunit.seconds.sleep(ext), non funziona correttamente, e non riesco a capire perché
    2) a un certo punto la classe fabbro, che non riesce appunto a ricevere correttamente i PUT, mi da nullpointerexception, presumo sia per il fatto che quando il minatore finisce l'estrazione, il fabbro sta ancora ricevendo e va a null
    3) quando il fabbro riceve un wait, aspetta, manda nuovamente la richiesta, ma non viene gestita (presumo sia un errore mio, sicuramente manca del codice)

    posto il codice completo delle 3 classi, se per cortesia potete aiutarmi un attimino a capire perché non funziona come dovrebbe, ve ne sarei grato, e magari damri qualche indizio su come risolvere

    miniera
    
    package Miniera;
    
    import java.io.IOException;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     *
     * @author Dark
     */
    public class Mine 
    {
        private static Thread[] threadArray = new Thread[3];
        
        public static void main (String[] args) 
        {
            System.out.println("Miniera");
            System.out.println("In attesa di richieste da parte del fabbro");
            
            //variabile che mi tiene conto dei minatori attivi, max 3
            ServerSocket server;
            Socket socket;
            
    
            try
            {
                //metto il server in ascolto sulla porta 41000
                server = new ServerSocket(41000);
                
                //lo metto in attesa perpetua
                while (true)
                {
                    socket = server.accept();
                    minerDispatch(socket);
                    System.out.println("richiesta ricevuta e girata al minatore");
                }
            }
            catch (IOException ioe)
            {
                System.out.println(ioe.getMessage());
            }   
        }
        
        //metodo che crea e verifica lo stato dei minatori tramite un array
        private static void minerDispatch(Socket socket) throws IOException
        {
            for(int i = 0; i < 3; i++)
            {
                if(threadArray[i] == null || threadArray[i].getState() == Thread.State.TERMINATED)
                {
                    threadArray[i] = new Thread(new Miner(socket));
                    threadArray[i].start();
                    break;
                }
                else
                {
                    PrintStream writer = new PrintStream(socket.getOutputStream());
                    writer.println("WAIT");
                    writer.flush();
                }
            }
        }
    }
    minatore
    
    package Miniera;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.util.Random;
    import java.util.concurrent.TimeUnit;
    
    
    
    /**
     *
     * @author Dark
     */
    public class Miner implements Runnable
    {
        private Socket socket;
        private boolean running = true;
        private Random rnd = new Random();
        private BufferedReader reader;
        private PrintStream writer;
        
        public Miner(Socket socket)
        {
            this.socket = socket;
        }
        
        @Override
        public void run ()
        {
            System.out.println("Minatore");
            
            while(running)
            {
                System.out.println("thread start");
                try 
                {
                    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    writer = new PrintStream(socket.getOutputStream());
                    System.out.println("gestione del flusso inizializzata");
                    
                    String[] request = reader.readLine().split(":");
                    System.out.println("richiesta ricevuta");
                    
                    if(!(request[0].equals("GET")))
                        running = false;
                    else
                    {
                        System.out.println("richiesta accettata");
                        int extracted = 0;
                        int qty = Integer.parseInt(request[1]);
                        System.out.println("quantità richiesta: " + qty);
                        
                        while(extracted < qty)
                        {
                            int ext = extract();
    
                            if ((qty - extracted) <= ext)
                            {
                                System.out.println("if" + (qty - extracted));
                                writer.println("PUT:" + (qty - extracted));
                                writer.flush();
                                extracted = qty;
                                running = false;
                            }
                            else if ((qty - extracted) == 0)
                            {
                                extracted = qty;
                                System.out.println("fine lavoro");
                                running = false;
                            }
                            else
                            {
                                extracted = extracted + ext;
                                System.out.println(extracted);
                                writer.println("PUT:" + ext + "outside");
                                writer.flush();
                                TimeUnit.SECONDS.sleep(ext);
                            } 
                        }
                        System.out.println("thread");
                        running = false;
                    }
                    writer.close();
                    reader.close();
                    socket.close();
                } 
                catch (IOException | InterruptedException ioe) 
                {
                    System.out.println(ioe.getMessage());
                }
            }
        }
        
        private int extract()
        {
            return rnd.nextInt(5)+1;
        }
    }
    fabbro
    
    package Miniera;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    import java.util.Random;
    import java.util.concurrent.TimeUnit;
    
    /**
     *
     * @author Dark
     */
    public class Blacksmith 
    {
        public static void main (String[] args) throws InterruptedException
        {
            Random rnd = new Random();
            Socket socket;
            BufferedReader reader;
            PrintStream writer;
            int qty;
            
            System.out.println("Fabbro");
    
            try
            {
                socket = new Socket ("127.0.0.1", 41000);
                System.out.println("collegamento riuscito");
                
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                writer = new PrintStream(socket.getOutputStream());
                System.out.println("gestione del flusso inizializzata");
                
                qty = rnd.nextInt(100);
                
                writer.println("GET:" + qty);
                writer.flush();
                System.out.println("richiesta inviata");
                
                
                while(reader.readLine() != null)
                {
                    if (reader.readLine().equals("WAIT"))
                    {
                        System.out.println("in attesa di reinviare la richiesta");
                        TimeUnit.SECONDS.sleep((rnd.nextInt(5)+1));
                        writer.println("GET:" + qty);
                        writer.flush();
                    }
                    else
                        System.out.println(reader.readLine());
                }
    
                writer.close();
                reader.close();
                socket.close();
            }
            catch (IOException ioe)
            {
                System.out.println(ioe.getMessage());
            }
        }
    }
    ringrazio anticipatamente
  • Re: Controllo thread

    Ok ho risolto, era una cavolata
Devi accedere o registrarti per scrivere nel forum
50 risposte