Verständnisfrage bezüglich Threads

  • Themenstarter Themenstarter Eugen_00
  • Beginndatum Beginndatum
E

Eugen_00

Gast
Moin,

ich bin gerade eifrig am Lernen für mein Informatik-Colloquium, das demnächst ist, und dabei habe ich ein Verständnisproblem bezüglich des Themas "Threads". Ich zitiere aus meinem Buch:

Die Threads eines Programms besitzen alle Objekte und Klassenattribute gemeinsam, sie nutzen aber getrennten Speicherplatz für die Parameter und die Attribute innerhalb von Methoden.

Heißt das, dass ich in der run() Methode eines Threads (A) Zugriff auf Objekte habe, die ich in einem Thread (B) instanziert habe? Oder wie muss ich mir das vorstellen?
 
Nee.. komische Formulierung ???:L Was ist das denn für ein Buch?

Der zweite Teil, mit dem getrennten Speicher, macht Sinn, und liefert die Antwort auf deine Frage: Nein. Thread haben getrennte Speicherbereiche, und was ein Thread macht kriegt der andere nicht mit - zumindest solange man nicht explizit sagt, dass sie irgendwas mit demSELBEN Objekt machen sollen....
 
Marco, findest du deine Formulierung nicht auch ein wenig komplizierender? 🙂
Die einfachste wäre wohl: Auf Methodenvariablen kann natürlich nicht gemeinsam zugegriffen werden, das ist bis auf Ausnahmen (final/anonyme Klassen) ja auch nur möglich solange die Methode abgearbeitet wird. Auf Klassenvariablen kann immer zugegriffen werden.

Bsp:

Java:
public class Threadding extends Thread 
{
	public static void main(String[] args) {
		Thread a = new Thread() {
			public void run() {
				int i = 0;
				
				for(int j = 0; j < 100; j++)
					i++;
			}
		};
		a.start();
		
		Thread b = new Thread() {
			public void run() {
				int k = 0;
				
				for(int l = 0; l < 100; l++)
					k++;
			}
		};
		b.start();
	}
}

2 Threads, a und b. Beide haben Methodenvariablen i und k. Gegenseitig können sie auf keine davon zugreifen.

Java:
public class Threadding extends Thread 
{
	private static int i;
	
	public static void main(String[] args) {
		Thread a = new Thread() {
			public void run() {
				for(int j = 0; j < 100; j++)
					i++;
			}
		};
		a.start();
		
		Thread b = new Thread() {
			public void run() {
				for(int k = 0; k < 100; k++)
					i++;
			}
		};
		b.start();
	}
}

Es gibt eine Klassenvariable, auf die beide bzw. alle Threads die die Sichtbarkeit dazu haben (Variablensichtbarkeit oder Getter/Setter) zugreifen können.
Vorsicht, der Code ist nur zur Veranschaulichung da und genaugenommen Müll, da beide Thread sehr schnell hintereinander lesen und schreiben, wodurch eine noch nicht vollständig durchgeführte Änderung die letzten des vorherigen Threads wieder überschreiben kann.


Genaugenommen legen Threads nur paralell- oder pseudoparalelle Abarbeitungen fest, mit deiner Variablenspeicherung haben sie wenig zu tun.
 
Och naja 😳 man hätte es sicher auch einfacher oder präziser formulieren können... Leider besteht oft ein Tradeoff zwischen "einfach" und "präzise", und beides gleichzeitig ist sehr aufwändig. Oder wie ein Haufen schlauer Leute gesagt haben soll: "Entschuldigen Sie, dass ich Ihnen einen langen Brief schreibe, für einen kurzen habe ich keine Zeit" 😉
 
Was ist das denn für ein Buch?
Das ist unser tolles Schulbuch vom Oldenbourg Verlag 🙂

Danke euch beiden, ihr habt meine Vermutung, dass das so nicht ganz stimmt, was da steht, bestätigt. Und danke für die Erklärungen, ich habe es tatsächlich jetzt verstanden 😀
 

Neue Themen


Zurück
Oben