Starten eines Threads

Kanitrino

Bekanntes Mitglied
Hallo Experten,

Ich habe das Gefühl, etwas Grundlegendes bzgl. Threads nicht verstanden zu haben. Ich möchte das an Hand von zwei Klassen erläutern :

Java:
import javax.swing.JApplet;

public abstract class AppletBasis extends JApplet implements Runnable 
{
	
	protected Thread running;
	protected static long msec;
	
	public abstract void run();
		
	public void starten()
	{	if (running == null);
		{	running = new Thread(this);
			running.start();
		}	
	}
	
	public void stop()
	{	running = null;
	}
	
	public void verzoegerung()
	{	try {Thread.sleep (msec);}
		catch(Exception e){}
	}
}
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class AppletErbe extends AppletBasis
{
	private static final long serialVersionUID = 1L;
	JButton bStart;
	int a = 0;
	
	public void init()
	{		
		msec 	= 200;
		bStart = new JButton("START");
		bStart.addActionListener
		(new ActionListener()  // Start-Button
			{public void actionPerformed(ActionEvent e)
			{
				stop();
				starten();
			}}
		);
		
		setLayout(new BorderLayout());
		add("South", bStart);
	}
		
	public void run()
	{
		while(true)
		{
			a = (a+10)%360;
			repaint();	
			verzoegerung ();	
		}
	}
	
	public void paint(Graphics g)
	{
		g.setColor(Color.white);
		g.fillRect(50, 50, 100, 100);
		g.setColor(Color.pink);
		g.fillArc(50, 50, 100, 100, a, 60);
	}
	
}
Das Problem ist, dass jedesmal, wenn ich auf den Button klicke, die Animation schneller läuft.
Wie kommt das ? Habe ich vllt zu viele Threads rzeugt ? Aber ich stoppe den alten doch jedes Mal !
Kann mit jemand das erklären ?
 
Wenn du einen Thread auf null setzt, ist er nicht automatisch beendet.
Es gibt eine Methode um einen Thread zu stoppen aber die Methode wurde depraced, da es nicht richtig funktioniert.
Du musst den Thread auslaufen lassen bzw. eine Abbruchbedingung einbauen.
 
Hi,

füge deiner Endlosschleifenbedingung eine weitere Aussage hinzu.

while(true)
zu
while(true && doRun)

über die Bool "doRun" kannst du nu den Thread unterbrechen, setz dir dazu einfach eine Methode für doRun = false;

Gruß
 
Java:
while(true && doRun)
=>
Java:
while(doRun)
das
Code:
true &&
kann man sich auch schenken 😉
 
Danke sehr !

Wenn man aber einen Thread weder richtig starten noch stoppen kann - ist dann nicht das gesamte Thread-Getue völlig sinnlos ?!

Aber mal im Ernst :
Wenn ich schreibe
Java:
boolean laufen;

public void run()
{
   while (laufen)
  {
     tueDiesUndDas();
  }
}

public void laufe(boolean laufen)
{
    this.laufen = laufen;
}
Merkt "er" das denn, wenn laufen sich geändert hat ? Oder müsste man dann nicht eigentlich noch mal run() bzw. start() aufrufen?
 
Zuletzt bearbeitet:
Wenn man aber einen Thread weder richtig starten noch stoppen kann - ist dann nicht das gesamte Thread-Getue völlig sinnlos ?!
Du kannst Threads richtig starten (Thread#start()) und auch richtig beenden (die run Methode auslaufen lassen). Das klappt eig. alles wunderbar 😉
 
Ja warum soll er das nicht merkern, es ist doch eine Schleife er kommt doch immer wieder an die Stelle an der er den boolean "laufen" abfragt
 
Wenn er in die Schleife gar nicht erst einsteigt, weil (zunächst) while(false) ist - wird dann die run()-Methode immer wieder abgefragt, ob nun inzwischen while(true) ist, auch wenn run() bereits abgearbeitet ist ?
 
Zuletzt bearbeitet:
Das heisst, es nutzt garnichts, wenn in meinem in #6 dargestellten Programm laufen = true gesetzt wird. Ich müsste also schreiben
Java:
public void laufe(boolean laufen)
{
    this.laufen = laufen;
    start();
}
oder
Java:
public void laufe(boolean laufen)
{
    this.laufen = laufen;
    run();
}
... aber dann bin ich genau wieder da, wo ich nicht hin will, nämlich, dass ich -zig Threads gleichzeitig erzeuge, die mein Programm immer schneller laufen lassen !
 
von mehreren Threads hast du bisher noch nicht gesprochen, und machen die ein Programm nicht eher langsamer als schneller?
wo du wie warum welche Variable setzt wird glaube ich auch mit mehr Postings immer unklarer statt klarer

was aber allgemein zu hinweisen ist:
programmiere
Java:
while (not ende) {
   while(mache pause) {
      Thread.sleep(1000); // 1 sec warten
   }
   Aktion ausführen
}
hier kannst du einen Thread pausieren ohne ihn endgültig zu beenden,
du kannst ihn auch schon starken bevor er etwas machen soll (am Anfang Pause einschalten)

die Pause-Schleife ginge auch ohne Thread-sleep, nur würde dann pro Sekunde millionenmal die Bedingung geprüft,
CPU geht auf 100% Last, mit sleep() ist der Thread kaum eine Belastung im Pause-Modus
 
von mehreren Threads hast du bisher noch nicht gesprochen, und machen die ein Programm nicht eher langsamer als schneller?
Das war eben die Frage aus meinem Eingangsbeitrag :
Das Problem ist, dass jedesmal, wenn ich auf den Button klicke, die Animation schneller läuft.
Wie kommt das ? Habe ich vllt zu viele Threads erzeugt ? Aber ich stoppe den alten doch jedes Mal !
Kann mit jemand das erklären ?
Sind wir überhaupt auf der richtigen Spur ?
 
ok, das hatte ich übersehen,
dass deine stop()-Methode aus dem ersten Post nichts stoppt wurde in der ersten Antwort gesagt,

dass dann mehrere Threads gleichzeitig
> a = (a+10)%360;
und ähnliches ausführen und die Animation schneller erscheinen lassen ist für mich nun verständlich

ansonsten sehe ich noch keine neuen Infos/ aktuellen Fragen,
und nein, möchte auch nicht alle Hinweise + bisherigen Änderungen einzeln nachverfolgen 😉

edit:
doch getan, also wieder bis zu
> Das heisst, es nutzt garnichts, wenn in meinem in #6 dargestellten Programm laufen = true gesetzt wird.

Antwort: doch, es reicht die Variable auf true/ oder false zu setzen, wenn sie in einer korrekten Schleife gut abgefragt wird,
nebenbei noch start() oder run() wäre unsinnig,
wenn du Probleme hast, dann stelle sie möglichst vollständig dar
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben