Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Concorrenza thread java

    Ciao a tutti ho da svolgere un esercizio in java ma non ci riesco.

    Data una matrice quadrata di interi devo scorrere la matrice tramite due thread sincronizzati in modo tale che il primo thread conta gli elementi dispari per ogni riga mentre il secondo thread crea per ogni riga un array di dimensione pari al numero di numeri dispari.

    Finora ho scritto questo ma non funziona

    codice:
    class Esercizio {
    
        private static int riga = 0;
        private static int [][] m = {{1,2,3,4,5} , {6,7,8,9,10} , {11,12,13,14,15}};
        private static int count = 0;
        private static Thread t1 ,t2;
    
    
        public synchronized static int [] getVettoreRiga () {
            return m [riga];
        }
    
    
        public static void main (String [] args) throws Exception {
            t1 = new Thread () {
                public void run () {
                    try {
                        t2.wait ();
                    }catch (Exception e) {
                        e.printStackTrace ();
                    }
                    while (riga < m.length) {
                        count = 0;
                        int [] a = getVettoreRiga ();
                        for (int i : a)
                            if (i%2 != 0)
                                count++;
    
    
                        notify ();                    
                    }
                }
            };
    
    
            t2 = new Thread () {
                public void run () {
                    while (riga < m.length) {
                        try {
                            t1.wait ();
                        }catch (Exception e) {
                            e.printStackTrace ();
                        }
                        int [] a = new int [count];
                        int pos = 0;
                        int [] b = getVettoreRiga ();
                        for (int i : b)
                            if (i%2 != 0) {
                                a [pos] = i;
                                pos++;
                            }
    
    
                        for (int i : a)
                            System.out.print (i + " ");
    
    
                        notify ();                    
                    }
                }
            };
    
    
            t1.start ();
            t2.start ();
    
    
            t1.join ();
            t2.join ();
            
            System.out.println ("FINITO");
    
    
        }
    
    
    }
    Aiutatemi vi prego!!!!
    Ultima modifica di surfacexxv; 13-11-2014 a 19:51

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    "Non funziona"... è il miglior modo per non ottenere alcuna risposta.
    Precisa COSA non funziona, QUALI eventuail errori ci sono e QUALI eventuali risultati errati hai.


    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

  3. #3
    Viene lanciata una eccezione "IllegalThreadStateException" alla riga in cui vi è "t2.wait ()"

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Il tuo codice è parecchio sbagliato/inappropriato per alcune questioni.
    Innanzitutto il problema tecnico che hai appena indicato è dovuto al fatto che i wait/notify vanno invocati su un oggetto di cui si possiede il lock (ovvero il thread corrente ha acquisito il lock). Pertanto wait() va usato in un contesto synchronized (metodo/blocco).

    Inoltre wait generalmente va messo in un loop che testa una condizione, che è quella che deve "tenere" affinché il thread resti in attesa. Pensa, come esempio, ad una coda "bloccante" di dimensione massima fissa: finché la coda è piena, un put() deve far stare il thread in attesa. È proprio quel "finché la coda è piena" che deve essere tradotto in un loop che testa la condizione "coda piena". Questo perché ci potrebbero essere altri motivi per cui un thread si risveglia ma quello che conta è appunto la condizione.
    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.