Problema thread Java

di il
22 risposte

22 Risposte - Pagina 2

  • Re: Problema thread Java

    Anonimamente22 ha scritto:


    La difficoltà sta nel fatto che se io mettessi un campo flag all'interno di quella classe cosi':
    Quel flag boolean "primo" (o come vuoi chiamarlo) lo devi mettere nella classe traguardo. Non nella classe classeth che rappresenta ciascun thread.

    Semplicemente: nel main costruisci un oggetto traguardo e poi quando costruisci gli N oggetti classeth gli passi (al costruttore, ovviamente) quello stesso medesimo oggetto traguardo.

    Quindi in classeth:
    - un campo in più di tipo traguardo
    - un parametro in più nel costruttore di tipo traguardo
    - assegnamento dell'oggetto traguardo dal parametro al campo
  • Re: Problema thread Java

    andbin ha scritto:


    Anonimamente22 ha scritto:


    La difficoltà sta nel fatto che se io mettessi un campo flag all'interno di quella classe cosi':
    Quel flag boolean "primo" (o come vuoi chiamarlo) lo devi mettere nella classe traguardo. Non nella classe classeth che rappresenta ciascun thread.

    Semplicemente: nel main costruisci un oggetto traguardo e poi quando costruisci gli N oggetti classeth gli passi (al costruttore, ovviamente) quello stesso medesimo oggetto traguardo.

    Quindi in classeth:
    - un campo in più di tipo traguardo
    - un parametro in più nel costruttore di tipo traguardo
    - assegnamento dell'oggetto traguardo dal parametro al campo
    Ecco il nuovo codice:
    Main
    
    import java.util.Scanner;
    
    public class main {
    
    	public static void main(String args[])
    	{
    		traguardo oggettoTraguardo=new traguardo();
    		random numeroCasuale=new random();
    		int numero=0;
    		Scanner input=new Scanner(System.in);
    		String nomeVeicolo=null;
    		classeth []prova =new classeth[10];
    		
    		for(int i=0;i<10;i++)
    		{
    	
    	numero=	numeroCasuale.geneatore();
    	nomeVeicolo=input.nextLine();
    		prova[i]=new classeth(numero,nomeVeicolo,oggettoTraguardo);
    		}
    		for(int i=0;i<10;i++)
    		{
    		prova[i].start();
    		}
    		int vincitore=0;
    		
    		
    		
    		/*String vincitoreNome=prova[0].nomeVeicolo;
    		vincitore=prova[0].valore;
    		for(int i=0;i<10;i++)
    		{
    		if(prova[i].valore<vincitore)
    		{
    			vincitore=prova[i].valore;
    			vincitoreNome=prova[i].nomeVeicolo;
    		}
    		}
    		System.out.println("\n\nVince....\n\n  "+vincitoreNome+"\ncon un delay di... "+vincitore);*/
    		
    	}
    }
    
    
    Classe:
    
    import java.io.Console;
    import java.lang.reflect.Parameter;
    
    import javax.swing.text.html.HTMLDocument.HTMLReader.ParagraphAction;
    
    public class classeth extends Thread{
    public int valore;
    public String nomeVeicolo;
    public traguardo ogTraguardo;
    
    public classeth(int valore,String nomeVeicolo,traguardo ogTraguardo) {
    	this.valore=valore;
    	this.nomeVeicolo=nomeVeicolo;// TODO Auto-generated constructor stub
    	this.ogTraguardo=ogTraguardo;
    }
    	@Override
    	public void run()
    	{
    		try {
    			traguardo ggTraguardo=new traguardo();
    			System.out.println("Macchina"+nomeVeicolo+"\n ha finito con:"+valore);
    			Thread.sleep(valore);
    			ggTraguardo.primo(nomeVeicolo);	
    
    
    		}
    		catch(InterruptedException ex){
    			
    	System.out.println("nn funz");	
    		}
    		}
    		}
    
    

    PERO' non mi è chiaro questo:

    andbin ha scritto:


    - assegnamento dell'oggetto traguardo dal parametro al campo
    Come dovrei fare?
  • Re: Problema thread Java

    Anonimamente22 ha scritto:


    PERO' non mi è chiaro questo:

    andbin ha scritto:


    - assegnamento dell'oggetto traguardo dal parametro al campo
    Come dovrei fare?
    No, continua a non esserti chiaro:

    in classeth NON DEVI fare new traguardo()

    In classeth metti un campo:
    public traguardo ogTraguardo; // OK

    Metti un costruttore che lo riceve:
    public classeth(int valore,String nomeVeicolo,traguardo ogTraguardo) { // OK

    e assegni il parametro al campo:
    this.ogTraguardo=ogTraguardo; // OK

    Stop, tutto lì. Nel run() ovviamente usi QUEL campo this.ogTraguardo ... non un qualche altro oggetto traguardo!
  • Re: Problema thread Java

    andbin ha scritto:


    Anonimamente22 ha scritto:


    PERO' non mi è chiaro questo:

    andbin ha scritto:


    - assegnamento dell'oggetto traguardo dal parametro al campo
    Come dovrei fare?
    No, continua a non esserti chiaro:

    in classeth NON DEVI fare new traguardo()

    In classeth metti un campo:
    public traguardo ogTraguardo; // OK

    Metti un costruttore che lo riceve:
    public classeth(int valore,String nomeVeicolo,traguardo ogTraguardo) { // OK

    e assegni il parametro al campo:
    this.ogTraguardo=ogTraguardo; // OK

    Stop, tutto lì. Nel run() ovviamente usi QUEL campo this.ogTraguardo ... non un qualche altro oggetto traguardo!

    Che ne pensi:
    
    import java.io.Console;
    import java.lang.reflect.Parameter;
    
    import javax.swing.text.html.HTMLDocument.HTMLReader.ParagraphAction;
    
    public class classeth extends Thread{
    public int valore;
    public String nomeVeicolo;
    public traguardo ogTraguardo;
    
    public classeth(int valore,String nomeVeicolo,traguardo ogTraguardo) {
    	this.valore=valore;
    	this.nomeVeicolo=nomeVeicolo;// TODO Auto-generated constructor stub
    	this.ogTraguardo=ogTraguardo;
    }
    	@Override
    	public void run()
    	{
    		try {
    			System.out.println("Macchina"+nomeVeicolo+"\n ha finito con:"+valore);
    			Thread.sleep(valore);
    			this.ogTraguardo.primo(nomeVeicolo,valore);	
    
    
    		}
    		catch(InterruptedException ex){
    			
    	System.out.println("nn funz");	
    		}
    		}
    		}
    
    
    Traguardo:
    
    import java.io.Console;
    
    public class traguardo {
    public boolean flag=true;
    	public String vittoria="victory!!!!";
    
    	public  synchronized void primo(String nome,int tempo)
    	{
    		if(flag==true)
    		{
    	System.out.println("PRIMOOOOOOO:"+nome+"\n con un tempo:"+tempo);	
    	
    	flag=false;
    		}
    		
    		
    	}
    
    	
    }
    
    
  • Re: Problema thread Java

    Anonimamente22 ha scritto:


    Che ne pensi:
    Sì, scritto così mi pare meglio e corretto/sensato.
    Magari la scritta "ha finito con" dopo lo sleep ... avrebbe più senso.
  • Re: Problema thread Java

    andbin ha scritto:


    Anonimamente22 ha scritto:


    Che ne pensi:
    Sì, scritto così mi pare meglio e corretto/sensato.
    Magari la scritta "ha finito con" dopo lo sleep ... avrebbe più senso.
    Sì lascia perdere il fattore estetico del programma che lascia molto a desiderare xD
    Più che altro , giusto per essere sicuro di aver capito.
    Facendo così come hai detto .
    I valori della classe traguardo , vengono presi dall'istanza presente nel main. Passati alla classe contenente i thread . E modificati nella classe traguardo stessa .
    Giusto ?
    Ti faccio sta domanda per capire se ci sono a livello di ragionamento. Perché l'importante è capirle le cose , copiarle e basta non ha senso xD
  • Re: Problema thread Java

    Anonimamente22 ha scritto:


    I valori della classe traguardo , vengono presi dall'istanza presente nel main. Passati alla classe contenente i thread . E modificati nella classe traguardo stessa .
    Giusto ?
    L'oggetto traguardo è uno solo, creato nel main. Poi viene passato a tutti gli oggetti classeth (i thread), quindi tutti hanno il riferimento allo stesso medesimo oggetto traguardo.
    E poi tutti i thread usano quell'oggetto traguardo per invocare il metodo che fa da "barriera" da passare per indicare l'arrivo.
  • Re: Problema thread Java

    andbin ha scritto:


    Anonimamente22 ha scritto:


    I valori della classe traguardo , vengono presi dall'istanza presente nel main. Passati alla classe contenente i thread . E modificati nella classe traguardo stessa .
    Giusto ?
    L'oggetto traguardo è uno solo, creato nel main. Poi viene passato a tutti gli oggetti classeth (i thread), quindi tutti hanno il riferimento allo stesso medesimo oggetto traguardo.
    E poi tutti i thread usano quell'oggetto traguardo per invocare il metodo che fa da "barriera" da passare per indicare l'arrivo.
    Capito!
    Volevo ringraziarti infinitamente per la pazienza e il prezioso aiuto che mi hai fornito
Devi accedere o registrarti per scrivere nel forum
22 risposte