Visualizzazione dei risultati da 1 a 6 su 6

Discussione: Thread

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    11

    Thread

    ciao a tutti sto facendo un esercizio sulla programmazione multithread e non capisco un errore del compilatore
    ecco il codice

    codice:
    package esercizio2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    /*
     * 2. Esercizio (Somma) Scrivere un programma multithread in Java che esegue una funzione di somma tra 
     due numeri interi inseriti dall’utente. Creare un thread separato per effettuare la somma e restituire il 
     risultato in una variabile intera (globale) condivisa con il thread principale. Il thread principale deve 
     sincronizzarsi sulla terminazione (join) del thread figlio Somma e stampare poi il risultato a video. 
     [Suggerimento: Per la variabile condivisa, creare una classe involucro HoldInteger con dei metodi get/set.]
     */
    
    public class MyThread implements Runnable {
    	private int valore1;
    	private int valore2;
    	private HoldInteger somma;
    
    	public MyThread(int valore1, int valore2, HoldInteger somma) {
    		super();
    		this.valore1 = valore1;
    		this.valore2 = valore2;
    		this.somma = somma;
    	}
    
    	@Override
    	public void run() {
    		somma.setI(valore1 + valore2);
    	}
    
    	public class HoldInteger {
    		private int i;
    
    		public int getI() {
    			return i;
    		}
    
    		public void setI(int i) {
    			this.i = i;
    		}
    
    	}
    
    	public static void main(String[] args) {
    		BufferedReader input = new BufferedReader(new InputStreamReader(
    				System.in));
    		HoldInteger somma = new HoldInteger();
    
    		try {
    			int valore1 = Integer.parseInt(input.readLine());
    			int valore2 = Integer.parseInt(input.readLine());
    		} catch (NumberFormatException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		Thread t = new Thread(new MyThread(valore1, valore2, somma));
    		t.start();
    		try {
    			t.join();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println(somma.getI());
    	}
    }
    l' errore è alla riga
    codice:
    Thread t = new Thread(new MyThread(valore1, valore2, somma));
    e dice
    Cannot make a static reference to the non-static field valore1
    e altri errori... di java conosco la programmazione basa e non capisco perchè dovrebbe essere static ..

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    Re: Thread

    Originariamente inviato da sirluca
    ciao a tutti sto facendo un esercizio sulla programmazione multithread e non capisco un errore del compilatore
    ecco il codice

    codice:
    package esercizio2;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    /*
     * 2. Esercizio (Somma) Scrivere un programma multithread in Java che esegue una funzione di somma tra 
     due numeri interi inseriti dall’utente. Creare un thread separato per effettuare la somma e restituire il 
     risultato in una variabile intera (globale) condivisa con il thread principale. Il thread principale deve 
     sincronizzarsi sulla terminazione (join) del thread figlio Somma e stampare poi il risultato a video. 
     [Suggerimento: Per la variabile condivisa, creare una classe involucro HoldInteger con dei metodi get/set.]
     */
    
    public class MyThread implements Runnable {
    	private int valore1;
    	private int valore2;
    	private HoldInteger somma;
    
    	public MyThread(int valore1, int valore2, HoldInteger somma) {
    		super();
    		this.valore1 = valore1;
    		this.valore2 = valore2;
    		this.somma = somma;
    	}
    
    	@Override
    	public void run() {
    		somma.setI(valore1 + valore2);
    	}
    
    	public class HoldInteger {
    		private int i;
    
    		public int getI() {
    			return i;
    		}
    
    		public void setI(int i) {
    			this.i = i;
    		}
    
    	}
    
    	public static void main(String[] args) {
    		BufferedReader input = new BufferedReader(new InputStreamReader(
    				System.in));
    		HoldInteger somma = new HoldInteger();
    
    		try {
    			int valore1 = Integer.parseInt(input.readLine());
    			int valore2 = Integer.parseInt(input.readLine());
    		} catch (NumberFormatException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		Thread t = new Thread(new MyThread(valore1, valore2, somma));
    		t.start();
    		try {
    			t.join();
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println(somma.getI());
    	}
    }
    l' errore è alla riga
    codice:
    Thread t = new Thread(new MyThread(valore1, valore2, somma));
    e dice
    e altri errori... di java conosco la programmazione basa e non capisco perchè dovrebbe essere static ..
    Forse ti conviene mettere il main in una classe separata, così ti accorgi subito dell'errore

    Ad ogni modo, stai cercando di accedere ad un attributo, valore1, da un metodo statico e questo non è permesso (se ragioni sul significato di static capisci subito il perché).

    Comunque il tuo problema specifico è un altro: chiedi all'utente valore1 e valore2... Ma queste variabili nascono e muoiono all'interno del blocco try! Quando poi usi valore1 e valore2 per istanziare MyThread, quelle variabili non esistono più! E quindi trova valore1 e valore2 dichiarate a livello di classe, che però non sono utilizzabili perché non statiche...
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Poi non capisco perché nel costruttore di MyThread gli passi la somma... Non te la deve calcolare il thread?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    11
    Grazie alex per la risposta... ho modificato creando le variabili fuori dal blocco try/catch per poi riassegnarle all' interno e i primi errori sono andati via, ora smanetto un pò con il resto tenendo a mente quello che mi hai detto.

    p.s.
    Il testo chiedeva di usare una variabile globale condivisa, essendo un po' arruginito di java l' unica cosa che mi è venuta in mente è di passargli il riferimento... Dici che ho fatto male?

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2013
    Messaggi
    11
    Ho risolto, l' ultimo errore era
    No enclosing instance of type MyThread is accessible. Must qualify the allocation with an enclosing instance of type MyThread (e.g. x.new A() where x is an instance of MyThread).
    riferito alla riga
    codice:
    HoldInteger somma = new HoldInteger();
    ho risolto spostando la classe HoldInteger fuori dalla classe MyThread nel pacchetto dove era dichiarata la classe MyThread.

    Grazie alex per l' aiuto!

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da sirluca
    Il testo chiedeva di usare una variabile globale condivisa, essendo un po' arruginito di java l' unica cosa che mi è venuta in mente è di passargli il riferimento... Dici che ho fatto male?
    Beh, in Java la cosa più simile ad una variabile globale è un campo public static..
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.