Scrivere su stesso array con Thread

di il
13 risposte

Scrivere su stesso array con Thread

Salve, ho un problema con i Thread in java, mi serve che lo stesso thread richiamato contemporanemanete più volte, mi scriva sullo stesso array.
In altre parole, ho bisogno che i thread condividano un'array per fare in modo di aggiungere elementi.
	for(int i=0;i<numeroThread;i++)
		{
			listaThread[i] = new MyThread(numeroThread(i));
			Thread t1 = new Thread(listaThread[i]);
			t1.start();
}
In questo modo creo tanti Thread dinamicamente i quali eseguno la stessa istruzione ma con in ingresso paramentri diversi.
Ho bisogno che in uscita ogni thread scriva su un array comune.

Come posso fare?
Grazi mille.

13 Risposte

  • Re: Scrivere su stesso array con Thread

    La domanda sorge spontanea:

    1) LO SAI che i vettori in Java sono degli oggetti di tipo REFERENCE (in pratica un puntatore) e se passi lo stesso vettore a piu' thread, TUTTI i thread vedono esattamente LO STESSO VETTORE?

    2) LO SAI che non puoi modificare una struttura dati in modo concorrente SENZA PREDENRE gli opportuni accorgimenti?

    3) LO SAI che cosa un mutex, una sezione crritica, un oggetto di sincronizzzazione?

    4) LO SAI a che cosa servono la keyword "synchronized" di Java e i metodi "wait" e "notify"/"notifyAll"

    come minimo?

    In aggiunta:

    5) LO SAI che se allochi abbastanza spazio in un vettore e OGNI THREAD va a SCRIVERE in una regione diversa dello stesso, NON SERVONO i punti 3) e 4) ?
  • Re: Scrivere su stesso array con Thread

    Butty ha scritto:


    Ho bisogno che in uscita ogni thread scriva su un array comune.

    Come posso fare?
    Innanzitutto per il fatto dell'array in "comune" semplicemente sarebbe sufficiente che ciascun thread possieda lo stesso riferimento a quell'array. E banalmente sarebbe sufficiente che passi questo riferimento a quel costruttore di MyThread.

    Ma c'è un'altra questione più importante. Più thread che vogliono accedere allo stesso array, DEVONO essere sincronizzati. Ovvero devi garantire mutua-esclusione nell'accesso a ciascun elemento dell'array e anche garantire la "visibilità" delle modifiche ad altri thread. Se non lo fai ... grandi casini ti aspettano ...
    E quindi direi che sarebbe meglio se incapsuli la gestione dell'array e della relativa sincronizzazione in una tua classe specifica e poi passi un oggetto di questa a tutti i thread, invece di passare direttamente il riferimento all'array. Hai postato poco, quindi si riesce solo ad intuire qualcosa. Bisognerebbe vedere meglio cosa vuoi fare di preciso.
  • Re: Scrivere su stesso array con Thread

    Salve, grazie per la risposta.
    So cosa è un puntatore e so che se lo passo a più thread essi vedono il vettore originario.
    So cosa è una sezione critica e la sincornizzazione.
    So a cosa serve syncronyzed e i metodi wait e notify.

    Non sono un esperto ma apprendo velocemente e qualche conoscenza base la posseggo.

    Per Andrea, grazie mille! Ho più o meno capito. Devo sincronizzare la'accesso all'array giusto?
    Spiego in due parole cosa devo fare in modo da essere più chiaro.

    Ho un array di sitiweb ai quali devo accedere con una get() per fare un parsing sull'html, attraverso le espressioni regolari mi "prendo" le date.
    Se nonn utilizzo i thread, il tempo che si impiega per fare tutte le get() è tantissimo, quindi ho pensato di parallelizzare le connessioni con dei thread.

    La tua soluzione potrebbe soddisfare la richiesta?

    Grazie ancora per la disponibilità.
  • Re: Scrivere su stesso array con Thread

    Butty ha scritto:


    Ho un array di sitiweb ai quali devo accedere con una get() per fare un parsing sull'html, attraverso le espressioni regolari mi "prendo" le date.
    Chiarisci meglio il contesto. Cosa intendi materialmente per "array di sitiweb"?
    Nota che il parsing di un HTML non è una cosa parallelizzabile.
  • Re: Scrivere su stesso array con Thread

    Ho un arrayList che contiene URL di siti web.
    Scorro tale ArrayList e creo la get().
    Non so se mi sono spiegato bene.
  • Re: Scrivere su stesso array con Thread

    Butty ha scritto:


    Ho un arrayList che contiene URL di siti web.
    Scorro tale ArrayList e creo la get().
    Non so se mi sono spiegato bene.
    Allora. Primo: NON serve che tutti i thread abbiamo accesso all'array. Basterebbe che a ciascun thread passi 1 URL da gestire.
    Ma se ho capito lo scenario, sarebbe molto più sensato se avessi un thread-pool di un numero tot fisso di thread a cui sottometti tanti "task" che sono ciascuno il parsing del HTML a fronte di un url.
  • Re: Scrivere su stesso array con Thread

    OK, volevo inserire le date in un array per poi poterle elabrare (es: la data più vecchia), come posso elaborarle in modo diverso?
    Non ho mai usato i thread-pool, ora me li studio.
    Grazie mille ancora.
  • Re: Scrivere su stesso array con Thread

    Butty ha scritto:


    OK, volevo inserire le date in un array per poi poterle elabrare (es: la data più vecchia), come posso elaborarle in modo diverso?
    Puoi descrivere BENE tutta la procedura? Parti con avere N url nel senso di oggetti java.net.URL o di stringhe contenenti l'url?
    Poi chiaramente devi fare una request a ciascun url per prendere la response (un HTML, giusto?). E poi il HTML lo elabori come? Usi espressioni regolari per estrarre cosa?
  • Re: Scrivere su stesso array con Thread

    Certo, allora:

    Ho un arrayList di String contententi URL di siti web.
    Con un ciclo scorro gli elementi dell'array e li passo come paramentro per la connessione e in seguito prendo la prima data con una regex, in questo modo
    Document doc1 = Jsoup.connect(elementoDellArrayDiString).get();
    	Element e1 = doc1.getElementsMatchingOwnText(pattern).first();
    
    Facendo tutto con un classico ciclo, il tempo di esecuzione dello stesso è lunghissmo, ho pensato di affidare la connesione per ogni sito ad un thread in questo modo:
    public void run() {
    		// TODO Auto-generated method stub
    		
    		try {
    			Pattern pattern = Pattern.compile("REGEX") // Ometto la regex che è lunga
    			Document doc1 = Jsoup.connect(a).get();
    			Element e1 = doc1.getElementsMatchingOwnText(pattern).first();
    			if(e1!=null)
    			{
    		      System.out.println(e1.text(););
    			}
    		
    			
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    Utilizzando il System.out.println, il processo di connessione per ogni URL dell'array si è nettamente velocizzato e fuzniona perfettamente.
    Ovviamnete non posso elaborare i dati di ogni connessione in quanto non vengono salvati.

    Ora è più chiaro?
    Grzie
  • Re: Scrivere su stesso array con Thread

    Butty ha scritto:


    Ho un arrayList di String contententi URL di siti web.
    Ok, lecito.

    Butty ha scritto:


    Con un ciclo scorro gli elementi dell'array e li passo come paramentro per la connessione e in seguito prendo la prima data con una regex, in questo modo
    Document doc1 = Jsoup.connect(elementoDellArrayDiString).get();
    	Element e1 = doc1.getElementsMatchingOwnText(pattern).first();
    
    Queste due operazioni NON sono parallelizzabili (non ha senso).

    Butty ha scritto:


    Facendo tutto con un classico ciclo, il tempo di esecuzione dello stesso è lunghissmo, ho pensato di affidare la connesione per ogni sito ad un thread in questo modo:
    Ma quanti url hai? 10? 100? 1000?
    Se ne hai davvero TANTI, allora NON ha senso creare 1 thread per ciascun url. Meglio usare un thread-pool e sottomettergli i task da fare. Se hai 1000 url, avrai 1000 task ma se il thread-pool è di 20 thread fissi, solo 20 pagine verranno esaminate "in concorrenza".
  • Re: Scrivere su stesso array con Thread

    Queste due operazioni NON sono parallelizzabili (non ha senso).
    Scusa per la mia ignoranza, perchè non ha senso? Se io affido ad ogni thread una connesione, queste non avvengono "simultaneamente"?
    Ma quanti url hai? 10? 100? 1000?
    Dipende, esamino siti di news e prendo gli URL degli articoli di ogni sezione, quindi a volte sono una ventina, altre più di 100.
    Comunque sono tanti.

    Devo studiare bene i thread-pool, possono essere la soluzione.
    Grazie.
  • Re: Scrivere su stesso array con Thread

    Butty ha scritto:


    Scusa per la mia ignoranza, perchè non ha senso? Se io affido ad ogni thread una connesione, queste non avvengono "simultaneamente"?
    Non mi sono espresso bene/chiaramente io, sorry. L'insieme delle due operazioni è chiaramente parallelizzabile, nel senso che ciascun thread opera su un url distinto. Questo sì, ha senso. All'inizio non mi era chiaro cosa volessi fare di preciso e con quale API e mi era venuta la sensazione che volessi "parallelizzare" il parsing sulla stessa medesima pagina. Questo no/nì non ha granché senso detto così.

    Butty ha scritto:


    Devo studiare bene i thread-pool, possono essere la soluzione.
    Sì, devi studiare il "Executor Framework" che è stato introdotto in JavaSE 5. Basta che cerchi info tipo "java executor framework" e trovi molte risorse.
  • Re: Scrivere su stesso array con Thread

    Sì, devi studiare il "Executor Framework" che è stato introdotto in JavaSE 5. Basta che cerchi info tipo "java executor framework" e trovi molte risorse.
    Ok perfetto.
    Ti aggiorno.
    Grazie mille per l’aiuto.
    A presto.
Devi accedere o registrarti per scrivere nel forum
13 risposte