Ciao ho bisogno di un aiuto.
Ho creato un' applicazione multi-thread, dove ogni thread invia un certo numero, di 3 tipologie diverse, di messaggi ad un application server.
Con l'obbiettivo di misurare le prestazioni dell' AS ho inserito nel metodo run del thread un eccezione che mi scrive su un file tutte le volte che l'AS non riesce a rispondere alla mia richiesta.
Ora volevo creare un test automatico che mi permettesse con un lancio solo dell'applicazione di effettuare diverse misure al variare del numero di messaggi, del numero dei thread e del tempo di sleep di un thread dopo che ha effettuato.
vi faccio vedere il codice:
Questo e' il mio main:
codice:
public static void main(String[] args) throws InterruptedException {
try {
File outputFile = new File("TestJboss2.txt");
outputFile.delete();
outputFile.createNewFile();
FileWriter fw = new FileWriter(outputFile.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
bw.write("TEST\n"); /*
* 1 test * Thread Number = 1 * Sleep = 0; * Message = 1 X 10;
*/ int[] ss = new int[]{50, 50, 150};
for (int i = 0; i < 10; i++) {
new Thread(new MioThread(ss, 1, 0, bw)).start();
}
Thread.currentThread().sleep(10000);
bw.close();
fw.close();
} catch (IOException e) {
}
}
l' array ' di 3 elementi (3 tipologie di messagi) e il valore corrispone al numero di messaggi.
questa e' la classe che implementa la "run"
codice:
public class MioThread implements Runnable {
int[] array;
private int sleep;
int nOfThreads;
BufferedWriter bw;
public MioThread(int[] array, int nOfTest, int sleep, BufferedWriter bw) {
this.array = array;
this.nOfThreads = nOfTest;
this.sleep = sleep;
this.bw = bw;
}
@Override
public void run() { //Set The Filters
GetPersonFilter filterP = GetPersonFilter.newBuilder().setName("rava").build();
GetAnimalFilter filterA = GetAnimalFilter.newBuilder().setName("bubi").build();
GetGodFilter filterG = GetGodFilter.newBuilder().setName("zeus").build();
for (int i = 0; i < this.array[0]; i++) {
try {
people = Exec.getPerson(filterP, i + 1);
} catch (Exception exc) {
String s = new String("Sleep Time: " + sleep + " Number of Treads: " + nOfThreads + " Number Of Message: " + array[0] + "\n");
synchronized (bw) {
try {
bw.write(s);
} catch (IOException e) {
e.printStackTrace();
}
}
}
try {
Thread.sleep(sleep);
} catch (InterruptedException iExc) {
iExc.printStackTrace();
return;
}
}
for (int j = 0; j < array[1]; j++) {
try {
animal = Exec.getAnimal(filterA, j + 1);
} catch (Exception e) {
String s = new String("Sleep Time: " + sleep + " Number of Threads: " + nOfThreads + " Number Of Message: " + array[1] + "\n");
synchronized (bw) {
try {
bw.write(s);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
try {
Thread.sleep(sleep);
} catch (InterruptedException iExc) {
iExc.printStackTrace();
return;
}
}
for (int i = 0; i < array[2]; i++) {
try {
olympo = Exec.getGod(filterG, i + 1);
} catch (Exception e) {
String s = new String("Sleep Time: " + sleep + " Number of Threads: " + nOfThreads + " Number Of Message: " + array[2] + "\n");
synchronized (bw) {
try {
bw.write(s);
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
try {
Thread.sleep(sleep);
} catch (InterruptedException iExc) {
iExc.printStackTrace();
return;
}
}
}
Volevo fare in modo di poter lanciare piu cicli "for" nel main ognuno con parametri (numero di thread, messaggi, e sleep) in modo che, ad esempio, il secondo for, partisse una volta che l'ultimo thread del primo "for" avesse finito la sua run.
Avevo pensato di utilizzare la "Join", ma essendo un neofita dei thread e di Java, mi sono un po incagliato.
Avete qualche suggerimento?