viele Threads

Status
Nicht offen für weitere Antworten.

Titanpharao

Bekanntes Mitglied
Hi,
ist es vorteilhaft, oder eher schlimm wenn man zum beispiel 100 Threads startet?

Wird das Programm daduch langsammer als wenn man die 100 dinge in einem machen würde?
 
G

Gast

Gast
prinzipiell braucht das erstellen eines Threads Zeit.
Code:
new Thread(someThingRunnable);

dadurch wird das ganze tendenziell langsamer.

Jeder Thread muß irgendwo seine Varibalen ablegen, sofern er welche benötigt. Speicherverbrauch steigt tendenziell an.

Richtig parallelität gibt es nicht. Der Prozessor rechnet erst an einem Thread herum, dann an einem anderen usw. Daher wird es hier auch eher keinen Geschwindigkeitsvorteil geben.

Greifen die Threads auf gleiche Resourcen zu kann es zu Problemen und inkonsistenzen geben.

Nutzt man die möglichkeit zur Synchronisation, kann eine bestimmte Resource während der Synchronisation nur von einem Thread genutzt werden, während die anderen warten.

Folge hierbei sind unter umständen deadlocks.

Ein klassisches Beispiel für das sinnvolle einsetzen von Threads macht das Drucken.
Beispiel ohne Thread.
a. MainThread stellt eine Textverarbeitung zur Verfügung.
b. Der Klick auf Drucken macht das Dokument fertig und
c. schickt es zum Drucker.
d. Sobald das Drucken abgeschlossen ist.
e. Kann die Textverarbeitung weiter genutzt werden.

Beispiel mit Thread.
a. siehe oben
b. startet neuen Thread.
a2. Dokument wird fertig gestellt und zum Drucker geschickt...
c. Sobald der Thread gestartet wurde kann die Textverarbeitung weiter genutzt werden ohne auf das Ende des Druckvorgangs warten zu müssen.

Es kommt also ganz darauf an was du machen möchtest.
 
G

Guest

Gast
Das lässt sich pauschal nicht sagen, wobei 100 Threads wohl ein wenig viel ist (außer bei nem Webserver z.B.) ;-)

Allgemein ist die Verwendung von Threads weder "gut" noch "böse", es kommt darauf an ob sich eine parallele Verarbeitung deiner Daten lohnt bzw. überhaupt möglich ist.

Beschreibe doch mal, was du machen willst, dann kann dir bestimmt geholfen werden.
 

Titanpharao

Bekanntes Mitglied
Also ich habe minimum 100 Monster auf meinem Spielfeld(JPanel) laufen.

Diese haben alle andere "Laufzeiten",also wann sie sich bewegen sollen. Dazu kommt noch das alle andere Laufgeschwindigkeiten haben.

Also zwei mal unterschiedliche Thread.sleep();

Jetz läst es sich schlecht bewerkstelligen das alles in einen Thread zu setzten.
Also starte ich für jedes Monster einen Thread, da sie sich ja alle unabhängig voneinander bewegen sollen.

Funktioniert auch schon :D ...aber nur bis maximal 8 Monster. Dannach kann ich das Spielfeld auf dem sie sich bewegen nicht mehr im Fenster bewegen. Also meine Spielfigur bewegt sich nicht mehr :cry:
 

Leroy42

Top Contributor
Titanpharao hat gesagt.:
...aber nur bis maximal 8 Monster. Dannach kann ich das Spielfeld auf dem sie sich bewegen nicht mehr im Fenster bewegen. Also meine Spielfigur bewegt sich nicht mehr :cry:

Wobei dass sicherlich nichts mit deine 8 gethreadeten Monstern zu tun hat.
Du machst da 100%-ig was anderes falsch!
 

Titanpharao

Bekanntes Mitglied
Was dann? Es ist aber echt bei 8 bei 9 gehts nicht mehr bei 8 schon.
mach das in etwa so...
Code:
			switch (r) {
			case 0:spieler.xpos++;break;
			case 1:spieler.ypos++;break;
			case 2:spieler.xpos--;break;
			case 3:spieler.ypos--;break;
			default:break;
			}		
        	System.out.println(r);
			move=new Task_Move(r);
			move.execute();
		}

Den neuen Thread zum laufen wird beblockt..er kommt da nicht rein merke ich. Auf Tastarur usw reagiert er wunderbar. Muss man sowas wie "priority" setzten?
 

Titanpharao

Bekanntes Mitglied
Der fürn Spieler...

Code:
class Task_Move extends SwingWorker<Void, Void> {
    	int r;
    	public Task_Move(int r){
    		this.r=r;
    	}    	
        @Override
        public Void doInBackground() {
        	run=false;
        	for(int i=1;i<9;++i){
            	try {Thread.sleep(45);}
            	catch (Exception e) {}
            	switch (r) {
				case 0: panel_area.setBounds( -(areax-4)*64+(-8*i), -(areay-4)*64, xhigh, yhigh);
						switch (i) {
						case 2:player.setIcon(new ImageIcon(playerimage.getSubimage(64, 64, 64, 64)));break;
						case 4:player.setIcon(new ImageIcon(playerimage.getSubimage(0, 64, 64, 64)));break;
						case 6:player.setIcon(new ImageIcon(playerimage.getSubimage(64, 64, 64, 64)));break;
						case 8:player.setIcon(new ImageIcon(playerimage.getSubimage(0, 64, 64, 64)));break;
						default:break;
						}
						break;				
				case 1: panel_area.setBounds( -(areax-4)*64, -(areay-4)*64+(-8*i), xhigh, yhigh);
						switch (i) {
						case 2:player.setIcon(new ImageIcon(playerimage.getSubimage(64, 128, 64, 64)));break;
						case 4:player.setIcon(new ImageIcon(playerimage.getSubimage(0, 128, 64, 64)));break;
						case 6:player.setIcon(new ImageIcon(playerimage.getSubimage(64, 128, 64, 64)));break;
						case 8:player.setIcon(new ImageIcon(playerimage.getSubimage(0, 128, 64, 64)));break;
						default:break;
						}
						break;	
				case 2: panel_area.setBounds( -(areax-4)*64+(8*i), -(areay-4)*64, xhigh, yhigh);
						switch (i) {
						case 2:player.setIcon(new ImageIcon(playerimage.getSubimage(64, 192, 64, 64)));break;
						case 4:player.setIcon(new ImageIcon(playerimage.getSubimage(0, 192, 64, 64)));break;
						case 6:player.setIcon(new ImageIcon(playerimage.getSubimage(64, 192, 64, 64)));break;
						case 8:player.setIcon(new ImageIcon(playerimage.getSubimage(0, 192, 64, 64)));break;
						default:break;
						}
						break;	
				case 3: panel_area.setBounds( -(areax-4)*64, -(areay-4)*64+(8*i), xhigh, yhigh);
						switch (i) {
						case 2:player.setIcon(new ImageIcon(playerimage.getSubimage(64, 0, 64, 64)));break;
						case 4:player.setIcon(new ImageIcon(playerimage.getSubimage(0, 0, 64, 64)));break;
						case 6:player.setIcon(new ImageIcon(playerimage.getSubimage(64, 0, 64, 64)));break;
						case 8:player.setIcon(new ImageIcon(playerimage.getSubimage(0, 0 , 64, 64)));break;
						default:break;
						}
						break;	
				default:break;
				}
            	repaint();            	
        	}
        	return null;
        }       
        
        @Override
		public void done() {
			switch (r) {
			case 0:areax++;break;
			case 1:areay++;break;
			case 2:areax--;break;
			case 3:areay--;break;
			default:break;
			}
			hud.l_xy.setText(spieler.xpos+","+spieler.ypos);
        	run=true;
        }
    }

So....ich habe festgestellt, das alle Threads die vor dem Monster-threads erstellt werden ausgeführt werden und die nach nicht mehr. Aber wirklich erst bei 8...


Und der vom Monster...

Code:
class Task_Monster extends SwingWorker<Void, Void> {
    	int mnr;
    	int laufen;
    	int richtung;
        public Task_Monster(int mnr) {
			this.mnr = mnr;
		}
		@Override
        public Void doInBackground() {
        	while(monsters.get(mnr).hp>0){
        		laufen=(int)(Math.random()*3000+1000);//TODO STUN ??        		
        		try {Thread.sleep(laufen);}
        		catch (Exception e) {}
        		richtung=(int)(Math.random()*4);
        		laufen(richtung);      			        		        			      		
        	}      	        	
        	return null;
        }
        @Override
		public void done() {
        }
 

masta // thomas

Bekanntes Mitglied
Auch wenn die verschiedenen Objekte unterschiedlich schnell bewegt werden sollen, kannst du alles in einen Thread packen - du musst lediglich überprüfen, wieviel Zeit zwischen jedem Durchlauf vergangen ist.
Die ganzen new ImageIcon() machen die Sache langsam. Du solltest darüber nachdenken, die Viecher zu zeichnen, und keine Panels zu bewegen!
 

Titanpharao

Bekanntes Mitglied
Es ist dennoch besser für jedes einen Thread zu haben, weil diese noch verändert werden.
Ich glaube nicht, dass bei z.B. einen richtigen RPG die Gegner sich alle durch einen Thread bewegen.

Ich habe mal bissel was getestet. Es können immer nur 10 endlose Threads gestartet werden. Wenn ich meinen Lebenspunkte-Regenerations Thread raus schmeiße, dann geht ein Monster mehr 9 statt 8 + 1 selber laufen =10.

ja das mit dem new ImageIcon ... soll ich sonnst alle schon davor laden?

Die Viecher bewegen sich auf dem Panel. Nur wenn der Spieler sich bewegt, dann muss das Panel verschoben werden. Schließlich ist der fest auf dem Bildschirm, also muss ich die Welt unter seinen Füßen bewegen.
 

Titanpharao

Bekanntes Mitglied
Lag mal SwingWorker. Habs jetzt mit
class bla extends Thread{}

gemacht...damit wuseln jetzt 100 Gegner auf einem Bildschirm rum :D

Wüste aber gern, warum es mit SwingWorker nicht ging ...
 

Rock Lobster

Bekanntes Mitglied
Hmm also bei Spielen arbeitet man üblicherweise nicht mit so vielen Threads. Meist verwendet man einen Thread für Netzwerk- und einen für Sound-Zeug, aber das Rendern und das Updaten passiert normalerweise nacheinander im MainThread. Also für jede Figur einen eigenen Thread zu machen kann meiner Meinung nach zu mehr Problemen führen als Du Dir davon Vorteile versprichst.
 
T

tuxedo

Gast
Titanpharao hat gesagt.:
ja das mit dem new ImageIcon ... soll ich sonnst alle schon davor laden?

Jupp, Bilder sollten vorher schon geladen werden. Zumindest solche die eh ständig gebraucht werden.

- Alex
 

EgonOlsen

Bekanntes Mitglied
Du brauchst in einem Spiel für die Spiellogik EINEN Thread (außer denen, die implizit sowieso da sind wie dem EDT). In diesem Thread machst du die Berechnungen für alle deinen Spielelemente nacheinander, evtl. auch das Zeichnen selber...das kommt darauf an, ob die aktives oder passives Rendering benutzt. Es gibt genau 0 Gründe, für jedes Element einen Thread zu machen, so wie es 0 Gründe gibt, die Sounds in einem extra Thread laufen zu lassen. Wozu? Die VM garantiert dir nicht, dass die Threads so an die Reihe kommen, wie du es haben willst, du bekommst wirre Reihenfolgen, es ruckelt unvorhersehbar, du bekommst Probleme mit der Synchronisation und das Spiel läuft nicht deterministisch. Außerdem erhöhst du den Verwaltungs- und Speicheraufwand. Es erscheint auf den ersten Blick zwar eine sexy Idee zu sein, aber es ist schlichtweg unsinnig.
Mach eine Spielschleife und steuere darin die Logik zeitabhängig, tick-basiert oder sonstwie. Aber verlass dich nicht auf Threads.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Multithreading: Wie viele Threads sollte ich erstellen? Allgemeine Java-Themen 12
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
K Zu viele Threads -> langsamer angehen. Allgemeine Java-Themen 3
A Best Practice Wie viele Referenzen machen Sinn? Weniger ist mehr? Allgemeine Java-Themen 1
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
Tacofan Hangman so viele Labels wie Buchstaben Allgemeine Java-Themen 5
K Variablen Konstruktor, unendlich viele Allgemeine Java-Themen 3
E Beliebig viele Worte Allgemeine Java-Themen 5
G Methoden Unterschiedliche viele Parameter Allgemeine Java-Themen 17
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
R Arrayausgabe enthält viele Leerzeichen Allgemeine Java-Themen 4
M Threads Viele Aufrufe aus Thread, komisches Verhalten Allgemeine Java-Themen 8
C Threads Verbraucht eine Zeitabfrage viele Rechen-Ressourcen? Allgemeine Java-Themen 8
J BlueJ Methode hat zu viele Parameter Allgemeine Java-Themen 6
D (Viele) Daten performant speichern und lesen Allgemeine Java-Themen 5
S Viele zip-files zu einem kombinieren..? Allgemeine Java-Themen 3
KrokoDiehl Viele JARs und deren Resourcen Allgemeine Java-Themen 9
S Zu viele Felder. Allgemeine Java-Themen 4
S Viele Bilder -> Speicher ausgelastet? / (De-)serialisierung geht nicht mehr richtig Allgemeine Java-Themen 8
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
R Moeglichst viele Datumsstrings in Date Objekte konvertieren? Allgemeine Java-Themen 3
O viele Datensätze aus Datenbank - Java Heap Space - Excepion Allgemeine Java-Themen 25
C Viele Informationen aus zwei Collections vergleichen Allgemeine Java-Themen 2
T Designfrage: Viele, kleine Objekte Allgemeine Java-Themen 13
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
E Viele if Abfragen auf viele Strings --> Alternative zu if Allgemeine Java-Themen 8
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
S Viele Fragen eines Umsteigers (von .NET) Allgemeine Java-Themen 6
rode45e Java Threads Allgemeine Java-Themen 4
M Threads Allgemeine Java-Themen 1
L Threads Threads in Chatroom Allgemeine Java-Themen 30
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6
CptK Backpropagation parallelisieren: Kommunikation zwischen den Threads Allgemeine Java-Themen 7
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
W Wieviele Threads sind sinnvoll? Allgemeine Java-Themen 8
W Alternative für Threads Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
G Threads vom Mainprogramm steuern Allgemeine Java-Themen 8
S BlockingQueue mit dynamischer Anpassung der Anzahl von Producer und Consumer Threads Allgemeine Java-Themen 1
x46 Threads Threads anhalten Allgemeine Java-Themen 1
J Threads verbessern die Performance NICHT ? Allgemeine Java-Themen 8
W Threads Problem Allgemeine Java-Themen 15
T Threads Tic Tac Toe mit Threads Allgemeine Java-Themen 1
M Threads über Kommandozeile Allgemeine Java-Themen 5
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
J Threads - java.lang.IllegalThreadStateException Allgemeine Java-Themen 6
J Internet Broswer in Threads öffnen Allgemeine Java-Themen 1
B Threads Multithreading Threads sollen warten Allgemeine Java-Themen 12
N 1000 MQTT Messages die Sekunde - 1000 Threads erstellen ? Allgemeine Java-Themen 10
D Threads Parallel laufende Threads Allgemeine Java-Themen 4
J Unvorhersehbares Verhalten - benutze ich die falsche Bedingungsprüfung oder brauche ich Threads? Allgemeine Java-Themen 12
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
P Threads Parallelisierte DB-Abfragen mit variabler Anzahl an Threads Allgemeine Java-Themen 4
J Threads Threads Allgemeine Java-Themen 9
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
E Threads Ausführung in Threads ist langsamer als ohne Threads Allgemeine Java-Themen 13
A Anzahl an Threads Systemweit Allgemeine Java-Themen 2
Tausendsassa Input/Output Problem mit der gleichzeitigen Ausgabe zweier Threads Allgemeine Java-Themen 8
S Alle Methodenaufrufe eines Threads notieren..? Allgemeine Java-Themen 7
M Threads JPanel eingeforen mit Threads Allgemeine Java-Themen 2
F Threads Allgemeine Java-Themen 6
F Threads Allgemeine Java-Themen 2
M Sinn von Threads? Allgemeine Java-Themen 1
J Wie erschaffe ich einen sicheren Datenaustausch zwischen Thread und Nicht-Threads Allgemeine Java-Themen 8
L Abfragen ob Threads fertig Allgemeine Java-Themen 3
P Threads Java Zugreifen Allgemeine Java-Themen 6
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
K KeyEvent in Threads Allgemeine Java-Themen 11
V Threads Weshalb funktionieren meine Threads nicht? Allgemeine Java-Themen 2
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
L Threads beenden Allgemeine Java-Themen 4
P Threads Threads nicht gleichzeitig starten Allgemeine Java-Themen 3
S Threads Threads werden nicht beendet Allgemeine Java-Themen 2
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
P 4 Threads in einer Methode Allgemeine Java-Themen 2
M Eclipse Mehrere Threads, mehrere Konsolen Allgemeine Java-Themen 4
OnDemand Threads und synchronized Allgemeine Java-Themen 9
R LinkedList und Threads: Strukturprobleme bez. löschen von Elementen Allgemeine Java-Themen 3
R LinkedList und Threads - welche Methode ist besser? Allgemeine Java-Themen 2
OnDemand Threads und synvhronized Allgemeine Java-Themen 2
S Problem mit Threads Allgemeine Java-Themen 1
W Threads Threads warten lassen Allgemeine Java-Themen 5
H Optimierung durch Threads Allgemeine Java-Themen 31
B Threads halten sich irgendwie auf... Allgemeine Java-Themen 6
M Threads Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
A Applet Alle Threads beim schließen des Applets beenden Allgemeine Java-Themen 8
A Problem mit der Synchronisierung von Threads Allgemeine Java-Themen 15
R SecurityManager für einzelne Klassen/Threads? Allgemeine Java-Themen 38
O Threads und If Befehle Allgemeine Java-Themen 7
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
C Threads und Exceptions Allgemeine Java-Themen 7
H java.lang.OutOfMemoryError bei der wiederholten Erzeugng von Threads Allgemeine Java-Themen 8
S Threads Abarbeitungsstatus von Threads in Datei schreiben Allgemeine Java-Themen 2
M Zugriff zweier Threads auf diesselbe Methode Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben