Jako, iż jest to mój pierwszy post na tym forum witam wszystkich programmersów :)
Piszę program na zaliczenie zajęć z Javy i utknąłem, proszę o pomoc
Mam tablicę wątków którym potrzebuję przekazać m.in. dwa inty, robię to przez konstruktor w petli for dla kazdego wątku. Wyglada to tak:
w[i] = new MyThread(a, b, xp[i], xp[i]+delta, wyn, 1);
w pierwszej iteracji petli for wszystko jest ok. przekazuję xPoczatkowe (xp[i]), xKoncowe (xp[i] + delta) i w debuggerze pokazuje wartosci xp=0, xk = 32. Natomiast podczas kolejnej iteracji zwiekszam xp o 32+1 i probuje przekazac kolejnemu watkowi kolejny zakres t.j. xp = 33 oraz xk = 64. Co się okazuje ? że do drugiego wątku przekazywane są poprawne parametry ALE w pierwszym wątku wartosci xp oraz xk są takie same ! mianowicie zamiast [0 oraz 32] jest [32 oraz 32]. Sadzilem ze typy podstawowe przekazywane sa przez referencję... Dlaczego xp[i] to tablica intów a nie pojedynczy int? bo kombinuję i kombinuję ale dalej nie wychodzi
aha dodam ze jak przekazywalem wartosci "z palca" tj bez petli for czyli:
w[0] = new MyThread(a, b, 0, 32, wyn, 1);
w[1] = new MyThread(a, b, 33, 65, wyn, 1);
w[2] = new MyThread(a, b, 66, 96, wyn, 1);
//.....
to wszystko dzialalo :) z gory dziekuje za pomoc
a tak wyglada calosc:
package watki;
import java.util.Random;
public class Watki {
private static void wypiszTab(int[][] tab, String napis){
System.out.println(napis + " :\n");
for(int i = 0; i < tab.length; i++){
for(int j = 0; j < tab[i].length; j++)
System.out.print(tab[i][j] + "\t");
System.out.println();
}
System.out.println("\n\n");
}
private static void wypiszTab(int[] tab, String napis){
System.out.println(napis + " :\n");
for(int i: tab)
System.out.println(i);
System.out.println("\n\n");
}
public static void main(String[] args) {
int rozmiar = 90, ileWatkow = 3, x = 0, delta = (rozmiar/ileWatkow)+1;
MyThread[] w = new MyThread[ileWatkow];
Thread[] ww = new Thread[ileWatkow];
int[][] a = new int[rozmiar][10];
int[] b = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, wyn = new int[rozmiar];
int[] xp = new int[ileWatkow] ;
Random generator = new Random();
for(int i = 0; i < a.length; i++)
for(int j = 0; j < a[i].length; j++)
a[i][j] = (generator.nextInt()%10)+10;
wypiszTab(a, "Tablica A");
wypiszTab(b, "Wektor B");
for(int i = 0; i < ileWatkow; i++){
xp[i] = x;
w[i] = new MyThread(a, b, xp[i], xp[i]+delta, wyn, 1);
ww[i] = new Thread(w[i]);
ww[i].start();
x+=delta+1;
}
wypiszTab(wyn, "Wyniki");
}
}
class MyThread implements Runnable{
private int[][] a;
private int[] b, wyn;
private int xp, xk, nrWatq;
public MyThread(int[][] a, int[] b, int xpp, int xkk, int[]wyn, int nrWatq){
this.a = a;
this.b = b;
this.xp = xpp;
this.xk = xkk;
this.wyn = wyn;
this.nrWatq = nrWatq;
}
public void run(){
System.out.println("Watek " + nrWatq + " rozpoczal sie");
for(;xp < xk && xp < a.length; xp++){
int s = 0;
for(int i = 0; i < a[xp].length; i++) {
s+=a[xp][i]*b[i];
}
wyn[xp] = s;
System.out.println("Watek " + nrWatq + " wyliczyl wlasnie wiersz");
try {
Thread.sleep((int)(Math.random()*16));
} catch(InterruptedException e){}
}
System.out.println("Watek " + nrWatq + " zakonczyl sie");
}
}