[Thread] Problem mit Synchronisierung?

Guten Tag Zusammen

Ich habe ein Problem mit Folgendem Code.
Und Ja der Codeabschnitt ist nur für Studienzwecke, nichts was Schaden anrichten soll.
Die Kommandozeilenausgabe gibt auch schon Auskunft über das Problem.
Wie man in den ersten Zeilen der Ausgabe erkennt, wird z.b die in
ASCII Kodierte Zahl 1 in der setBrute Methode Ausgegeben und auch gespeichert.
In der run() Methode des Thread wird jedoch als erstes ASCII Zeichen die Zahl 2 Ausgegeben.

Die Methode setBrute() wird dabei von einer Oberklasse nur Aufgerufen,
wen die Variable needBrute == true ist.

        private boolean needBrute = true;
        private byte Brute[];
        
        void setBrute(byte BruteS[]) {
            System.out.println("setBrute: 	" + new String(BruteS));
            this.Brute = BruteS;
            this.needBrute = false;
        }
 
        public void run() {
            while (!HashCracked) {
                if (needBrute == false) {
                    System.out.println("In Run: 	" + new String(Brute));
                    if (MD5Hash.equals(MD5Java.hash(Brute))) {
                        FinalBrute = String.valueOf(new String(Brute));
                        HashCracked = true;
                        break;
                    }
                    needBrute = true;
                }
                else {
                    try {Thread.sleep(1);}
                    catch (InterruptedException e) {}
                }
            }
        }
    }```


Die Konsolenausgabe

setBrute: 1
In Run: 2
setBrute: 2
In Run: 3
setBrute: 3
In Run: 4
setBrute: 4
In Run: 5
setBrute: 5
In Run: 6
setBrute: 6
In Run: 7
setBrute: 7
In Run: 8
setBrute: 8
In Run: 9
setBrute: 9
In Run: 0
setBrute: 0
In Run: a
setBrute: a
In Run: b
setBrute: b
In Run: c
setBrute: c
In Run: d
setBrute: d
In Run: e
setBrute: e
In Run: f
setBrute: f
In Run: g
setBrute: g
In Run: h
setBrute: h
In Run: i
setBrute: i
In Run: j
setBrute: j
In Run: k
setBrute: k
In Run: l
setBrute: l
In Run: m
setBrute: m
In Run: n
setBrute: n
In Run: o
setBrute: o
In Run: p
setBrute: p
In Run: q
setBrute: q
In Run: r
setBrute: r
In Run: s
setBrute: s
In Run: t
setBrute: t
In Run: u
setBrute: u
In Run: v
setBrute: v
In Run: w
setBrute: w
In Run: x
setBrute: x
In Run: y
setBrute: y
In Run: z
setBrute: z
In Run: A
setBrute: A
In Run: B
setBrute: B
In Run: C
setBrute: C
In Run: D
setBrute: D
In Run: E
setBrute: E
In Run: F
setBrute: F
In Run: G
setBrute: G
In Run: H
setBrute: H
In Run: I
setBrute: I
In Run: J
setBrute: J
In Run: K
setBrute: K
In Run: L
setBrute: L
In Run: M
setBrute: M
In Run: N
setBrute: N
In Run: O
setBrute: O
In Run: P
setBrute: P
In Run: Q
setBrute: Q
In Run: R
setBrute: R
In Run: S
setBrute: S
In Run: T
setBrute: T
In Run: U
setBrute: U
In Run: V
setBrute: V
In Run: W
setBrute: W
In Run: X
setBrute: X
In Run: Y
setBrute: Y
In Run: Z
setBrute: Z
In Run: Z

Ein KSKB würde da sicher helfen (wie auch im anderen Forum…)

Okay habe eine KSKB erstellt, hoffe wir können das Problem finden <.<
Konnte Heute Nacht deswegen nichtmal richtig Schlafen habe nur Quellcode vor den Augen gehabt <.<

Die Main Klasse

package ThreadProblem;

public class ThreadProblem {
	static final byte zTon[] = {'1','2','3','4','5','6','7','8','9','0'};
	static MD5Creator thread1 = new MD5Creator();
	
	public static void main(String[] args) {
		thread1.start();
		
		byte Brute[] = new byte[1];
		for (byte c : zTon) {
			Brute[0] = c;
				BruteGiven:
				while (true) {
						if (thread1.needBrute) {
							thread1.setBrute(Brute);
							break BruteGiven;
						}
				}
		}
		
		thread1.interrupt();
		System.exit(1);
	}
	
}

Die Klasse vom Thread

package ThreadProblem;

class MD5Creator extends Thread {
	boolean needBrute = true;
	byte Brute[];
	
	synchronized void setBrute(byte BruteS[]) {
		System.out.println("setBrute: 	" + new String(BruteS));
		this.Brute = BruteS;
		this.needBrute = false;
	}

	public void run() {
		while (true) {
			if (needBrute == false) {
				System.out.println("In Run: 	" + new String(Brute));
				needBrute = true;
			}
			else {
				try {Thread.sleep(1);}
				catch (InterruptedException e) {}
			}
		}
	}
}

Hmja… was genau erwartest du? Es wird das ‘brute’ an den MD5Creator übergeben. Bevor der in seiner “run”-Methode irgendwas damit machen kann, läuft der main-Thread schon weiter, und setzt Brute[0] = c (also 2 in diesem Fall).

Insgesamt ist das aber ohnehin ziemlicher Murks, mit den “while(true)”-Schleifen die kein wait() enthalten (und auch kein Thread.sleep, was aber hier ohnehin nicht angebracht werden) und den booleans, die von einen Thread gelesen und vom anderen geschrieben werden, aber weder in einen sychronized-Block stehen noch ‘volatile’ sind. WENN das ““funktionieren”” würde, wäre das eher Zufall…

Beschreib’ vielleicht mal genauer, WAS der Code eigentlich machen soll…

Jaa^^ Ist mir eben auch Aufgefallen da ich von C komme wusst eich nicht das Java ein Array als Referenz übergibt.
Weil bei C muss man das immer Explizit angeben.
Ist nur ein Beispielcode der das Problem darstlelen soll, ansosnten sit er für Nix gut.
das der Code auch ohne Fehler Mist ist stimmt, wie gesagt ist nurn Beispiel.

Thread kann geschlossen werden.
Schönen Tag noch^^

Wenn’s darum geht würde
this.Brute = BruteS.clone();
vermutlich schon “funktionieren”, aber… die restlichen wichtigen Punkte bleiben natürlich besehen…