2012-03-24 6 views
11

Wenn ich ein lauffähiges ObjektEinzel runnable Objekt mehr Thread Konstrukteuren Passing

Runnable run = new MyRunnable(); 

Und dann exakt das gleiche Objekt zu zwei Fadenbauern übergeben erstellen und

new Thread(run).start; 
new Thread(run).start; 
  1. Ist das möglich laufen ? Was sind die Auswirkungen?
  2. Wenn ich Thread.sleep aufrufen (0); Werden in der Klasse MyRunnable beide Threads inaktiviert, weil sie das gleiche Objekt sind oder ist die Thread-Entity vollständig vom Objekt getrennt?
  3. Würde es jemals einen Grund geben, dies zu tun, wenn nicht, bitte noch die beiden obigen Fragen beantworten, weil ich glaube, dass ich den Fadenmechanismus noch nicht vollständig verstanden habe?
+4

Warum testest du es nicht selbst aus und siehst es? –

+2

Der Versuch, zu erkennen, was mit Thread nur durch Tests passiert, kann manchmal aufgrund der Art der Threads zu nicht eindeutigen Ergebnissen führen. Ich möchte in diesem Fall die Robustheit meines Programms nicht dem Zufall überlassen. – rubixibuc

Antwort

10
  1. Es ist definitiv möglich und legal. Wenn Ihr Runnable keinen Status (keine Felder) hat, dann wird alles in Ordnung sein. Wenn Ihr Runnable einen veränderbaren Status hat, müssen Sie möglicherweise einen der zahlreichen wechselseitigen Ausschlussmechanismen von Java wie ReentrantLock oder das synchronized Schlüsselwort verwenden. Da beide Threads die Felder des gleichen Runnable Objekts mutieren werden.

  2. Nein, Sie haben zwei verschiedene Threads erstellt und ausgeführt. Sie rufen einfach Runnable.run().

  3. Es ist nicht außerhalb der Möglichkeiten. Ich würde nicht einmal sagen, dass es eine schlechte Praxis ist. Besondere Situationen, in denen Sie diese links als Übung für den Leser tun könnten ...

+0

3. Ein Anwendungsfall: Eine Feder Singleton-Komponente als lauffähig haben. –

7

1) Ist das möglich? Was sind die Auswirkungen?

Ja, es ist möglich.

Die Implikation ist, dass jeder Zustand in der Runnable (möglicherweise) von allen Threads geteilt wird, und der Zugriff auf/update von diesem Zustand muss ordnungsgemäß synchronisiert werden.

2) Wenn ich Thread.sleep aufrufen (0); Werden in der Klasse MyRunnable beide Threads inaktiviert, weil sie das gleiche Objekt sind oder ist die Thread-Entity vollständig vom Objekt getrennt?

Nein, werden sie nicht.

Der Thread unterscheidet sich logisch von der Runnable. Der Aufruf von Thread.sleep() wirkt sich nicht direkt auf die Runnable und andere Threads aus, die sie möglicherweise teilen. (Es könnte andere Threads bewirken indirekt, zB wenn ein Thread schläft, während es die Runnable primitive Sperre hält, und die anderen Threads müssen die Sperre erwerben, um Fortschritte zu machen.)

3) Wäre es überhaupt einen Grund geben, um dies zu tun, wenn nicht, bitte beantworte noch die beiden obigen Fragen, weil ich den Thread-Mechanismus noch nicht vollständig verstanden habe?

Sie Macht dies tun, wenn kein Thread-spezifische Zustand mit dem Runnable zugeordnet ist und Sie wollten Raum Gemeinkosten oder die Gemeinkosten der Initialisierung des Runnable minimieren. Solche Anwendungsfälle sind jedoch in der Praxis selten.

In der überwiegenden Mehrheit der tatsächlichen Anwendungsfälle benötigt jeder Thread eine eindeutige Runnable Instanz.

Verwandte Themen