Threads: synchronized mach nicht was es soll?

Status
Nicht offen für weitere Antworten.

Shana

Mitglied
Hallo,

Ich habe 2 Thread-Klassen erstellt. Die run()-Methode enthält eine Schleife die von 1 bis 20 zählt und das Ergebnis ausgibt. Die Ausgabe ist dann so: Thread 1 und Thread2 werden "gemischt" ausgegeben, dh. es wird beispielsweise für Thread1 von 0 bis 15 gezählt, anschließen zählt Thread2 von 0 bis 18, dann Thread1 von 16 bis 20 und dann wieder Thread2 von 19 bis 20. Soweit so gut.

Synchronized sollte aber, falls ich das richtig verstanden habe, dafür sorgen, dass zuerst Thread1 von 1 bis 20 zählt und anschließen Thread2.

Mein Problem: Dies geschieht jedoch nicht.


Java-code:

Thread 1:
Code:
public class BspThread1 extends Thread{
	
	public  synchronized void Schleife1(){
			for(int i = 0; i<= 20; i++) {
				System.out.println("Thread1: " + i);
			} 
			
	}
		
	public void run(){
		 Schleife1();
	}

}

Thread 2:
Code:
public class BspThread2 extends Thread{
	
	public  synchronized void Schleife2(){
			for(int i = 0; i<= 20; i++) {
				System.out.println("Thread2: " + i);
			} 
			
	}
		
	public void run(){
		 Schleife2();
	}

}


Main-Methode:Startklasse
Code:
public class StartThreads {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		BspThread1 bspt1 = new BspThread1();
		BspThread2 bspt2 = new BspThread2();
		
		bspt1.start();
		bspt2.start();

	}

}

Ausgabe:
Code:
Thread1: 0
Thread1: 1
Thread1: 2
Thread1: 3
Thread1: 4
Thread1: 5
Thread1: 6
Thread1: 7
Thread1: 8
Thread1: 9
Thread1: 10
Thread1: 11
Thread1: 12
Thread1: 13
Thread2: 0
Thread2: 1
Thread2: 2
Thread2: 3
Thread2: 4
Thread2: 5
Thread2: 6
Thread2: 7
Thread2: 8
Thread2: 9
Thread2: 10
Thread2: 11
Thread2: 12
Thread2: 13
Thread2: 14
Thread2: 15
Thread2: 16
Thread2: 17
Thread2: 18
Thread1: 14
Thread2: 19
Thread2: 20
Thread1: 15
Thread1: 16
Thread1: 17
Thread1: 18
Thread1: 19
Thread1: 20


Diese Ausgabe sollte eigentlich passen, wenn ich synchronized nicht verwende, aber nicht wenn ich dies tue oder?

Danke für eure Hilfe!
MfG Shana

PS: Ich habe die Suchfunktion verwendet und auch was zu dem Thema gefunden. Es sollte eigentlich funktionieren, jedoch hat mir das auch nicht geholfen, deswegen der Thread.
 
S

SlaterB

Gast
synchronized funktioniert nicht Programm-Global!

wenn BspThread1 auf sich selber synchronisiert, dann müssen alle warten, die auch auf das BspThread1-Objekt synchronisieren,
aber BspThread2 kocht sein eigenes Süppchen, die beiden haben nichts gemeinsam,

entweder einer der beiden Threads synchronisiert auf den anderen oder beide auf ein statisches Objekt oder so,

synchronized(object) {

}

es geht sogar

synchronized(StartThreads.class) {

}
 

Murray

Top Contributor
Dieser Code
Code:
public class BspThreadX extends Thread{
   
   public  synchronized void schleifeX(){
         for(int i = 0; i<= 20; i++) {
            System.out.println("ThreadX: " + i);
         }
         
   }
      
   public void run(){
       SchleifeX();
   }
}

macht das gleiche wie

Code:
public class BspThreadX extends Thread{
   
   public  void schleifeX(){
         synchronized ( this) {
             for(int i = 0; i<= 20; i++) {
                System.out.println("ThreadX: " + i);
             }
         }
   }
      
   public void run(){
       schleifeX();
   }
}

Eine als synchronized deklarierte Instanz-Methode synchonisiert auf die jeweilige Instanz.

Um Dein Ziel zu erreichen, müssten beide Threads auf das gleiche Objekt synchronisieren.

Bsp:

Code:
class BspThreadBase extends Thread{

   static Object monitor = new Object();
}

class BspThread1 extends  BspThreadBase {
   
   public  void schleife1(){
         synchronized ( monitor) {
             for(int i = 0; i<= 20; i++) {
                System.out.println("Thread1: " + i);
             }
         }
   }
      
   public void run(){
       schleife1();
   }
}

class BspThread2 extends  BspThreadBase {
   
   public  void schleife2(){
         synchronized ( monitor) {
             for(int i = 0; i<= 20; i++) {
                System.out.println("Thread2: " + i);
             }
         }
   }
      
   public void run(){
       schleife2();
   }
}


//EDIT: da war Slater mal wieder schneller - schläfst du eigentlich nie??
 

André Uhres

Top Contributor
Noch ein kleiner Tipp: seit Java 5 haben wir "java.util.concurrent.Executors.newSingleThreadExecutor"
was einen "Executor" erzeugt, der einen einzelnen Workerthread verwendet
um eine unbegrenzte Warteschlange abzuarbeiten.
Die Prozesse werden garantiert der Reihe nach durchgeführt
und jederzeit ist nicht mehr als ein Prozess aktiv:
Code:
import java.util.concurrent.*;
public class StartThreads {
    public static void main(final String[] args) {
        ExecutorService exe = Executors.newSingleThreadExecutor();
        exe.submit(new BspThread1());
        exe.submit(new BspThread2());
        exe.shutdown();//es werden keine weiteren Prozesse mehr angenommen
    }
}
class BspThread1 implements Runnable {
    public void run() {
        for (int i = 0; i <= 20; i++) {
            System.out.println("Thread1: " + i);
        }
    }
}
class BspThread2 implements Runnable {
    public void run() {
        for (int i = 0; i <= 20; i++) {
            System.out.println("Thread2: " + i);
        }
    }
}
 
S

SlaterB

Gast
hmm, reicht dann nicht ein einfacher eigener Thread, der die run-Methoden aufruft? ;)

gut, man spart sich 30 Zeilen selber zu programmieren, aber darauf musste man doch nicht bis 1.5 warten
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Wo finde ich in der Java Api die Notation zu Threads bezüglich Synchronized? Java Basics - Anfänger-Themen 14
berserkerdq2 Findet eine parallele Verarbeitung in Java bei Threads erst statt, wenn man die Methoden auch synchronized? Und wie sieht bei Conditions aus? Java Basics - Anfänger-Themen 8
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
B synchronized threads Java Basics - Anfänger-Themen 17
B warum schließt synchronized andere threads nicht aus? Java Basics - Anfänger-Themen 7
I Synchronized Threads Java Basics - Anfänger-Themen 4
R Problem: Threads Synchronized machen Java Basics - Anfänger-Themen 5
M OOP Synchronized Methoden, zugriff aus Threads Java Basics - Anfänger-Themen 4
X Threads und synchronized - Verständnisproblem Java Basics - Anfänger-Themen 3
M Kleines Problem mit Threads (synchronized) Java Basics - Anfänger-Themen 3
S bin zu blöd für threads - wait, notify, synchronized Java Basics - Anfänger-Themen 11
L Threads und synchronized Java Basics - Anfänger-Themen 8
A Problem mit Threads und synchronized Java Basics - Anfänger-Themen 3
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C Threads und Swing Java Basics - Anfänger-Themen 9
B Monitor als Schranke von Threads Java Basics - Anfänger-Themen 20
W Threads Alphabet Java Basics - Anfänger-Themen 20
H Threads Anfänger Java Basics - Anfänger-Themen 17
1 Threads parallel laufen Java Basics - Anfänger-Themen 11
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
M Threads Java Basics - Anfänger-Themen 12
L Threads Synchronisierung zwischen threads Java Basics - Anfänger-Themen 4
M Threads Java Basics - Anfänger-Themen 2
A Threads Java Basics - Anfänger-Themen 9
A Threads Java Basics - Anfänger-Themen 13
A Threads und .join Java Basics - Anfänger-Themen 14
W Threads starten Java Basics - Anfänger-Themen 2
J Wieviele threads? Java Basics - Anfänger-Themen 9
J Problem bei seriellem Start von Threads Java Basics - Anfänger-Themen 11
O Threads Java Basics - Anfänger-Themen 2
L Buchungssystem und Threads Java Basics - Anfänger-Themen 2
O Threads - Synchronize(), join(), wait(), notify(), yield() Java Basics - Anfänger-Themen 6
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
A Kommunikation zwischen nebenläufigen Threads Java Basics - Anfänger-Themen 4
S Gemeinsame Ressource und Mehrfachinstanziierung von Threads Java Basics - Anfänger-Themen 16
S Verklemmung Threads Java Basics - Anfänger-Themen 11
B Threads 2 Threads gleichzeitig laufen lassen Java Basics - Anfänger-Themen 1
M Threads Threads laufen sequenziell, statt gleichzeitig. Java Basics - Anfänger-Themen 9
M Threads run Methode Java Basics - Anfänger-Themen 4
javajoshi mehrere Threads: Methoden zentral unterbringen Java Basics - Anfänger-Themen 8
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
L Threads Mit Threads JLabel ändern! Java Basics - Anfänger-Themen 2
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
S Kleine Frage zu Threads Java Basics - Anfänger-Themen 3
M Mit 2 Threads eine Zahl hochzählen Java Basics - Anfänger-Themen 13
T Threads Synchronisieren Java Basics - Anfänger-Themen 6
D Frage Threads Java Basics - Anfänger-Themen 6
Z Threads Executor Framework - Aufgabe auf n Threads aufteilen Java Basics - Anfänger-Themen 10
kilopack15 Verständnisfrage zur Verwendung von notify() bei Threads Java Basics - Anfänger-Themen 2
kilopack15 Mehrere Threads in einer Klasse Java Basics - Anfänger-Themen 8
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
J Aufgabe(Threads) richtig verstanden/implementiert Java Basics - Anfänger-Themen 27
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
T Threads Durch threads gestartete Prozesse killen Java Basics - Anfänger-Themen 2
J Threads Java Basics - Anfänger-Themen 38
D Alte Klausuraufgabe Threads Java Basics - Anfänger-Themen 10
A Threads Threads bestimmte Aufgaben zuweisen... Java Basics - Anfänger-Themen 3
R Threads in JavaFX Java Basics - Anfänger-Themen 3
E Threads Doppelte Threads beenden Java Basics - Anfänger-Themen 4
F Sicheres Zurückmelden aus Threads Java Basics - Anfänger-Themen 0
G Threads zum Thema Threads??? null Ahnung Java Basics - Anfänger-Themen 4
Q Threads Threads in Swing Anwendungen Java Basics - Anfänger-Themen 5
J ConcurrentCalculation Multi Threads in Java Java Basics - Anfänger-Themen 3
P Threads Trotz Threads wird nur 1 Prozessorkern ausgelastet Java Basics - Anfänger-Themen 7
M "restartable" threads Java Basics - Anfänger-Themen 11
M Threads - summieren Java Basics - Anfänger-Themen 13
W Klassen Variable einer anderen Klasse ändern (Threads) Java Basics - Anfänger-Themen 3
E Threads - Programm analysieren Java Basics - Anfänger-Themen 2
E join() bei zwei Threads Java Basics - Anfänger-Themen 2
T Threads Threads richtig synchronisieren Java Basics - Anfänger-Themen 3
D [Concurrency/Threads] Code Umsetzung Schriftlich Java Basics - Anfänger-Themen 2
D Threads Java Basics - Anfänger-Themen 4
M Threads nio Dateien kopieren, Threads und Gui Java Basics - Anfänger-Themen 0
N Verweise auf Variablen in verschiedenen Threads Java Basics - Anfänger-Themen 4
T Java-Threads Java Basics - Anfänger-Themen 0
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Problem mit Threads Java Basics - Anfänger-Themen 11
M Threads - wo gehören sie hin? Java Basics - Anfänger-Themen 3
S 2D-Spiel mit Threads... Java Basics - Anfänger-Themen 3
J Threads Java Basics - Anfänger-Themen 3
F ExecutorService und offene Threads Java Basics - Anfänger-Themen 3
P Threads Threads nicht nebenläufig Java Basics - Anfänger-Themen 7
M Threads nicht nebenleblaufig Java Basics - Anfänger-Themen 2
B Threads parallel zur main Java Basics - Anfänger-Themen 3
M Threads Java Basics - Anfänger-Themen 2
M Threads, zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M Threads und Methodenübergreifender Variablezugriff Java Basics - Anfänger-Themen 2
J Wie handle ich Threads am besten? Java Basics - Anfänger-Themen 2
H Threads Java Basics - Anfänger-Themen 10
E Mehrmaliges Ausführen eines Threads Java Basics - Anfänger-Themen 5
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
T Alle Threads .notify() Java Basics - Anfänger-Themen 13
R Threads Verständnisschwierigkeit Java Basics - Anfänger-Themen 2
J Können mehere Threads parallel eine Datei lesen? Java Basics - Anfänger-Themen 4
G Methoden in Threads wandeln Java Basics - Anfänger-Themen 7
H Threads Java Basics - Anfänger-Themen 17
F Java Concurrency - Threads Java Basics - Anfänger-Themen 4
V Threads Threads synchronisieren Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben