Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort
Fino a 740 km WLTP con la batteria da 97,2 kWh, sospensioni che leggono la strada con una telecamera e un abitacolo da salotto parigino. La nuova DS N°7 raccoglie l'eredità della DS 7 e la porta, per la prima volta, nel mondo 100% elettrico. Ecco come è fatta, cosa offre e quanto costa.
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più
Abbiamo provato Samsung Galaxy Tab S12 Ultra nella versione 12 GB + 256 GB con tastiera, e il risultato è un tablet che in questa configurazione si comporta come un notebook con la fluidità tipica di Android. Spessore di 5,1 mm, display Dynamic AMOLED 2X da 14,6 pollici, MediaTek Dimensity 9500 e un software senza incertezze compongono un prodotto di vertice, con prezzi da 1.539 euro, frenato solo da un'autonomia nella parte bassa del confronto
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 22-05-2014, 19:48   #1
Squiddi
Bannato
 
Iscritto dal: May 2013
Messaggi: 18
dubbi sui Thread [JAVA]

Salve a tutti ragazzi, dovrei fare un esercizio in Java ma ho avuto qualche problema in qualche passaggio, innanzitutto vi spiego cosa deve fare il mio programma, dato un array di 100000 elementi devo generare un valore casuale in quell' intervallo e devo fare tre thread (non so come separarli), uno che ricerca da inizio alla fine, un altro che ricerca dalla fine all' inizio e un terzo thread che ricerca da metà spostandosi avanti di uno e indietro di uno, poi avanti di due e poi indietro di due, ecc... Poi appena uno dei tre thread trova il valore generato al lancio del programma deve interrompere gli altri due.

Allora, i miei problemi sono che prima di tutto non riesco a fare il terzo thread che ricerca partendo da metà, cioè deve partire dal centro, poi cercare il valore sopra la metà, poi il valore sotto la metà e così via (per esempio se è da 1 a 100 deve cercare da 50, poi 51, poi 49, poi 52, poi 48, ecc...).
Poi l' altro mio problema è che quando uno dei tre thread di ricerca ha finito deve interrompere anche gli altri due stampando che ha finito, come faccio ?
Intando ecco il mio condice che ho scritto finora:


///********** CLASSE RICERCA *******///
ublic class Ricerca extends java.lang.Thread {

/**
* indice minimo di ricerca
*/
int imin;

/**
* indice massimo di ricerca
*/
int imax;

/**
* array che contiene gli elementi da verificare
*/
int v[];

/**
* valore da ricercare
*/
int val;

/**
* Costruttore generale
* @param imin indice minimo
* @param imax indice massimo
* @param v vettore
* @param val valore da cercare
*/
public Ricerca(int imin, int imax, int[] v, int val) {
super();
this.imin = imin;
this.imax = imax;
this.v = v;
this.val = val;
}

/**
* visualizza gli indici degli elementi presenti in v con valore val
*/
public void run() {
Thread t = Thread.currentThread();
t.setName("Ricerca da "+imin+" a "+imax);
for(int i=imin;i<=imax;i++)
if (v[i]==val)
{
System.out.println(t.getName()+" indice "+i);
try {
sleep((long)(Math.random() * 1000)); //attesa casuale
} catch (InterruptedException e) {
e.printStackTrace();
}
}

System.out.println(t.getName()+" Finito");
}
}



///***************CLASSE MAIN**********************///

public class Main {
public static void main(String[] args) {
final int dimArray = 1000000; //dimensione array
final int dimValori = 10000; //valori casuali fra 1 e dimValori
int vett[] = new int[dimArray];
int valore;
// caricamento array con valori casuali
for (int i=0;i<dimArray;i++)
vett[i] = (int) (Math.random() * dimValori);
valore = (int) (Math.random() * dimValori);
System.out.println("Valore da cercare: "+valore);
// imposta la classe per la ricerca nella prima parte dell'array
Ricerca thr1 = new Ricerca(0, dimArray/2-1, vett, valore);
// imposta la classe per la ricerca nella seconda classe dell'array
Ricerca thr2 = new Ricerca(dimArray/2,dimArray-1, vett, valore);
thr1.start();
thr2.start();
System.out.println("Thread partiti");
while(thr1.isAlive()||thr2.isAlive()); // attesa
System.out.println("Entrambe i Thread sono terminati");
}

}



Grazie mille in anticipo
Squiddi è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2014, 13:53   #2
Squiddi
Bannato
 
Iscritto dal: May 2013
Messaggi: 18
Rispondete per favore è urgente
Squiddi è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2014, 14:30   #3
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Ho modificato un po' il tuo codice e messo nel package com.sottovento SOLO per motivi di debug. Non voglio impossessarmi del tuo codice, non preoccuparti

alcune parole:
1 - il ciclo che facevi nel main() bruciava la cpu per nulla. Meglio delle join();
2 - per sincronizzare i thread utilizzo una AtomicBoolean, cioe' una semplice variabile booleana. Questo semplifica molto il codice e garantisce comunque che la variabile sia modificata atomicamente;
3 - una sola classe di ricerca e' sufficiente, basta aggiungere un paio di parametri. Se c'e' qualcosa che ti suona strano, chiedi pure ma non sono sicuro di poter rispondere: qui nel deserto Internet funziona raramente;
4 - ho aggiunto il nome dei thread cosi' da semplificare il debug e i messaggi di trace nel caso abbia bisogno di cercare errori



Codice:
package com.sottovento;

import java.util.concurrent.atomic.AtomicBoolean;

/*
 * @author squiddi
 */
public class Main
{
    /**
     * Everything starts here
     * @param args command line arguments
     */
    public static void main(String[] args)
    {
        final int dimArray = 1000000; //dimensione array
        final int dimValori = 10000; //valori casuali fra 1 e dimValori
        int vett[] = new int[dimArray];

        int toBeFound;
        // caricamento array con valori casuali
        for (int i=0;i<dimArray;i++)
            vett[i] = (int) (Math.random() * dimValori);

        toBeFound = (int) (Math.random() * dimValori);
        System.out.println("Valore da cercare: "+toBeFound);

        AtomicBoolean done = new AtomicBoolean(false);  /* Questo viene modificato atomicamente, quindi non c'e' bisogno di sincronizzarne l'accesso */

        // Ricerca dall'inizio alla fine
        int startIndex = 0;
        int endIndex = dimArray-1;
        int step = 1;
        boolean alternate = false;
        String threadName = "Thread_ascendente";
        Ricerca thr1 = new Ricerca(threadName, done, startIndex, endIndex, step, alternate, vett, toBeFound);
        
        // Ricerca dalla fine all'inizio
        startIndex = dimArray-1;
        endIndex = 0;
        step = -1;
        alternate = false;
        threadName = "Thread_discendente";
        Ricerca thr2 = new Ricerca(threadName, done, startIndex,endIndex, step, alternate, vett, toBeFound);

        // Ricerca allontanandosi dalla meta'
        startIndex = dimArray/2;
        endIndex = 0;
        step = 1;
        alternate = true;
        threadName = "Thread_matto";
        Ricerca thr3 = new Ricerca(threadName, done, startIndex, endIndex, step, alternate, vett, toBeFound);

        thr1.start();
        thr2.start();
        thr3.start();

        System.out.println("Thread partiti");
        try
        {
            thr1.join();    /* wait for thr1 completion */
            thr2.join();    /* wait for thr2 completion */
            thr3.join();    /* wait for thr3 completion */
            int index1 = thr1.getFoundIndex();
            int index2 = thr2.getFoundIndex();
            int index3 = thr3.getFoundIndex();
            if (index1 >= 0)
                System.out.println ("Thread \"" + thr1.getThreadName() + "\" has found the element in position " + index1);
            if (index2 >= 0)
                System.out.println ("Thread \"" + thr2.getThreadName() + "\" has found the element in position " + index2);
            if (index3 >= 0)
                System.out.println ("Thread \"" + thr3.getThreadName() + "\" has found the element in position " + index3);
            
        }
        catch (InterruptedException e)
        {
            System.out.println ("Applicazione interrotta");
        }
        System.out.println("Tutti i thread sono terminati");
    }
}

class Ricerca extends Thread
{
    private final int startIndex;
    private final int endIndex;
    private final int step;
    private final boolean alternate;
    private final int vect[];
    private final int toBeFound;
    private final AtomicBoolean done;
    private final String threadName;

    /* Risultati da ritornare al chiamante */
    private int foundIndex; /* Indice contenente l'elemento trovato, oppure -1 */

    public Ricerca(String threadName, AtomicBoolean done, int startIndex, int endIndex, int step, boolean alternate, int[] vect, int toBeFound)
    {
        this.threadName = threadName;
        this.done       = done;
        this.startIndex = startIndex;
        this.endIndex   = endIndex;
        this.step       = step;
        this.alternate  = alternate;
        this.vect       = vect;
        this.toBeFound  = toBeFound;
        this.foundIndex = -1;
    }

    public int getFoundIndex()
    {
        return foundIndex;
    }

    public String getThreadName()
    {
        return threadName;
    }

    /**
     * visualizza gli indici degli elementi presenti in vect con valore val
     */
    @Override
    public void run()
    {
        int index = 0;
        while (!done.get() && (startIndex + index) >= 0 && (startIndex + index) < vect.length)
        {
            if (vect[startIndex + index] == toBeFound)
            {   /* Element found. All thread should stop their process */
                foundIndex = startIndex + index;
                done.set(true); /* This makes all threads stopping */
            }
            else
            {
                if (alternate)
                {
                    index = -index;
                    if (index >= 0)
                        index += step;
                }
                else
                    index += step;
            }
        }
    }
}
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2014, 15:22   #4
Squiddi
Bannato
 
Iscritto dal: May 2013
Messaggi: 18
Grazie mille ma...

Grazie mille
Ho provato il tuo codice è corretto penso, ma l' unico problema è che quando ricerco un valore devono saltare fuori tutte le scritte dei thread che ricercano il l'elemento, cioè così:
Thread 1 sta cercando è al valore 000
Thread 1 sta cercando è al valore 001
Thread 1 sta cercando è al valore 002

E così continua finchè uno dei tre thread non lo trova, grazie in anticipo Sei molto gentile
Squiddi è offline   Rispondi citando il messaggio o parte di esso
Old 23-05-2014, 15:37   #5
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Quote:
Originariamente inviato da Squiddi Guarda i messaggi
Grazie mille
Ho provato il tuo codice è corretto penso, ma l' unico problema è che quando ricerco un valore devono saltare fuori tutte le scritte dei thread che ricercano il l'elemento, cioè così:
Thread 1 sta cercando è al valore 000
Thread 1 sta cercando è al valore 001
Thread 1 sta cercando è al valore 002

E così continua finchè uno dei tre thread non lo trova, grazie in anticipo Sei molto gentile
Non mi sembra un problema: ho assegnato un nome ad ogni thread per questo motivo.
Ora sono un po' impegnato. Puoi provarci e farmi sapere se hai problemi.

Ciau
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
L’ex CEO di Intel Gelsinger punta su una...
Techly, quattro nuovi supporti TV fra mo...
Mass Effect sacrificato per Star Wars: i...
Gemini, addio al copia e incolla per cor...
13 miliardi per un colpo di stato? NVIDI...
L'agente AI Wabi crea mini-app su misura...
Edge è il primo browser a supportare Acc...
L'IA di Firefox ora compila i moduli da ...
Tracking pixel nelle email: cosa cambia ...
La GeForce RTX 5080 da 24 GB potrebbe ar...
Apple mette alle strette OpenAI, la caus...
Xbox ancora in calo: ecco com'è a...
Car of the Year 2027: sette finaliste e ...
Google Beam cambia tutto: arrivano le vi...
Curry Barker, il regista di Obsession, p...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:35.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v