Ciao!
Ho un codice per fare delle prove sul funzionamento dei thread in Java. Non sono molto esperto
, ma i due thread, creati da due oggetti diversi, dovrebbero essere indipendenti e agire su variabili indipendenti.
Dall'output del programma però non sembra che le cose vadano così, nonostante gli array hi[] separati (uno per ciascun oggetto) e i metodi dichiarati synchronized. A volte uno dei due array non viene inizializzato, a volte uno contiene soltanto una parte dei valori corretti. Perché succede questo? Come si può evitare?
Grazie,
Fabio
codice:
package pack1;
public class Thread1Example {
public static void main(String[] args) {
Writer w1 = new Writer("Thread1");
Writer w2 = new Writer("Thread2");
String[] arr = new String[10];
w1.setString(arr);
w2.setString(arr);
w1.start();
w2.start();
w1.printString();
w2.printString();
}
}
package pack1;
public class Writer extends Thread {
private volatile String[] hi = new String[10];
private String name1;
public Writer(String nam)
{
super(nam);
this.name1 = nam;
}
public synchronized void printString()
{
int n=0;
System.out.println("This array belongs to " + this.name1);
for(n=0;n<10;n++)
{
System.out.println(hi[n]);
}
}
public void setString(String[] hii)
{
hi=hii;
}
public void run()
{
method1();
}
public synchronized void method1()
{
int n=0;
for(n=0;n<10;n++)
{
if(name1.compareTo("Thread1")==0)
{
hi[n]="yes";
try
{
}
catch(Exception except)
{
System.out.print(except);
}
}
else
{
hi[n]="no";
try
{
}
catch(Exception except)
{
System.out.print(except);
}
}
}
}
}
L'output è (e cambia quasi ogni volta che si esegue il programma):
codice:
This array belongs to Thread1
null
null
null
null
null
null
null
null
null
no
This array belongs to Thread2
no
no
yes
yes
yes
yes
yes
yes
yes
yes