Ciao intanto ti irngrazio, sei davvero molto gentile! Si è una prova didattica per farmi un'idea di come funziona. L'idea era quella di provare a scrivere il modo esclusivo su di una risolrsa condivisa fra più threads. Effettivamente già il codice funzionava, ma mi ero fissato che dovesse scrivere prima un thread (eseguisse tutti il ciclo for), poi il secondo e così via. Invece era giusto come avevo fatto, l'importante era che in nessun caso due o più threads scrivessero contemporanemente sulla stessa risorsa.
Beh, certo. L'oggetto Lista è uno solo utilizzato da entrambi i thread e questo è ok (non è il massimo tenere il reference a Lista come campo statico, sarebbe stato più corretto passare ad entrambi i thread il reference. Ma sono questioni più di "design").
Ho risistemato il codice, così è migliore ??
Codice PHP:
public class Test {
public static void main(String[] argv){
ThreadsSincronizzati threadSincronizzati = new ThreadsSincronizzati();
}
}
Codice PHP:
import java.util.*;
public class ThreadsSincronizzati {
private Lista lista;
private Thread01 thread01;
private Thread02 thread02;
private ThreadStampa threadStampa;
public ThreadsSincronizzati(){
lista = new Lista();
thread01 = new Thread01(lista);
thread02 = new Thread02(lista);
threadStampa = new ThreadStampa(lista);
thread01.start();
thread02.start();
threadStampa.start();
}
}
Codice PHP:
import java.util.*;
public class Lista {
private static ArrayList lista;
public Lista(){
lista = new ArrayList();
}
public synchronized void aggiungi(String testo){
lista.add(testo);
}
public synchronized void stampa(){
for(int i = 0; i < lista.size(); i++){
System.out.println(lista.get(i));
}
}
}
Codice PHP:
public class Thread01 extends Thread {
private Lista lista;
public Thread01(Lista lista){
this.lista = lista;
}
public void run(){
System.out.println("ESECUZIONE THREAD 01");
for(int i = 0; i < 100; i ++){
lista.aggiungi("THREAD01 " + i);
try{
this.sleep(20);
}
catch(Exception err){
System.out.println("ERRORE THREAD 01");
}
}
}
}
Codice PHP:
public class Thread02 extends Thread {
private Lista lista;
public Thread02(Lista lista){
this.lista = lista;
}
public void run(){
System.out.println("ESECUZIONE THREAD 02");
for(int i = 0; i < 100; i ++){
lista.aggiungi("THREAD02 " + i);
try{
this.sleep(20);
}
catch(Exception err){
System.out.println("ERRORE THREAD 01");
}
}
}
}
Ti ringrazio ancora e adesso provo a fa eseguire completamente un thread e poi passare l'esecuzione al successivo come mi hai mostrato nel codice che hai postato.