Anfängerfrage - Multithreading

Status
Nicht offen für weitere Antworten.

ub007

Mitglied
Hallo !

Ich habe ein Java-Kurs als PDF aus dem Internet geladen, dass ganz O.K. ist. Im letzten Teil wird Multithreading beschrieben. Da ich diesen Kurs nicht besucht habe fehlt mir irgendwie der Zusammenhang bei dieser Übung. Es ist ein kleines Programm das einen Halbmond von links nach rechts laufen läßt. Es ist gar nicht so schwierig aber es gibt ein paar Programm-Punkte die ich nicht verstehe. Die Grafik-Befehle sind vorerst nicht wichtig.
Das Programm kann im Appletviewer oder im Browser angezeigt werden. Der grobe Aufbau von Multithreading ist mir klar. Das wäre der Kommentar /*0*/ und 4. Aber die Punkte 1,2,3,5 und 6 nicht.
In diesem Programm wird nie init() /*1*/ aufgerufen. D.h. für mich das offensichtlich das irgendwie Java für mich erledigt, oder ?
Ebenso werden start() - stop() - update() und paint() nie aufgerufen. Wenn ich sie im Programm entferne geht das Programm nicht mehr. Also muss auch hier Java irgendwie was machen oder etwas vordefiniertes ( Overloading ? ) haben.
Mit ist auch nicht so richtig klar warum man für dieses Programm z.B. ein Multithreading-code einsetzt. Gut, das hat sich der Dozent halt einfallen lassen und ist für mich dennoch interessant. Ich dachte Multithreading ist gut geeignet für mehrere Abläufe gleichzeitig die dann unabhängig voneinander laufen, aber hier ist mir das unklar.
Vielleicht habe ich aber etwas grundsätzliches bei Multithreading nicht verstanden.
Wer kann mir helfen ?
(Das Programm habe ich nochmals als Text-File angehängt.)

Code:
import java.awt.* ;
import java.applet.* ;

/*0*/
public class Anima extends Applet implements Runnable {
	private volatile boolean runFlag;
	private int x, y, height, width;
	private Image img;
	private Graphics g;
	private Thread t = null;
	private Color nightColor = new Color (0, 0, 102);
	private Color moonColor = new Color (204, 204, 255);

/*1*/
	public void init() {
		Dimension d = getSize();
		width = d.width;
		height = d.height;
		img = createImage (width, height);
		g=img.getGraphics();
		x = width/2;
		y = height/2;
	}

/*2*/
	public void start() {
		if (t == null)
		{
			t = new Thread (this);
			t.start();
		}
	}

/*3*/
	public void stop() {
		if (t != null)
		{
			runFlag=false; // or: t.stop();
			t=null;
		}
	}

/*4*/
	public void run () {
		runFlag=true;
		while (runFlag) 
		{
			g.setColor (nightColor);
			g.fillRect(0,0,width,height);
			g.setColor (moonColor);
			g.fillArc(x, y-25, 50, 50, 270, 180);
			repaint();
			x = x + 2;
			if (x > width+50 ) 
			{
				x = -50;
			}
			try { Thread.sleep(100); }
			catch (InterruptedException e) {}
		}
	}

/*5*/
	public void update (Graphics g) {
		paint(g);
	}

/*6*/
	public void paint (Graphics g) {
		if (img != null) 
		{
			g.drawImage(img,0,0,null);
		}
	}
}
 

Anhänge

Bezüglich init,start und stop findest in der Applet-API nötige Infos. Was den Umgang mit paint und update angeht, ob das bei Applets derart üblich ist, weiss ich grad nicht, da kann vielleicht wer anderes etwas dazu sagen.
 
paint und update ruft man nie manuell auf, sie werden automatisch aufgerufen wenn das Applet denkt das es neu gemalt werden muss bzw. wenn du es mit repaint() dazu aufforderst.

run wird hierdurch aufgerufen:
Java:
			t = new Thread (this);
			t.start();
Das heißt der Code in der run-Methode wird nebenläufig/asynchron/... zu den anderen Code ausgeführt. Wenn der Code der run-Methode nicht in einem extra Thread ausgeführt werden würde, könnte es Probleme mit der GUI geben (freeze)
 
Hallo diggaa1984 - hallo Schandro !

Yep. Danke an euch beide für die schnelle Antwort. Hat geholfen !!!

Gruß Uli
 
Hey Leute , also wenn ich was male mit der paint Methode und es mit einen Thread bewegen lasse, dann flackert es meistens.

Daher überschreibe ich die update Methode . ( Doppelpufferung ). So habe ich es mal gelernt gehabt.

Java:
public void update (Graphics g)
	{
		// Initialisierung des DoubleBuffers
		if (dbImage == null)
		{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}

		// Bildschirm im Hintergrund löschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}
}


Wie geht ihr denn da vor?
 
Aso 😉

Da ist es schon mit drin !^^
Danke für die Info. Dann baue ich mal alles in JApplet um , macht vielleicht mehr sinn , als in AWT die Apllets zu lassen.

Oder würdet ihr denn gleich JFrame bevorzugen.?

Ich bin bei ein SpielTut, durch zugehen und wollte mir die Mühe machen , dass umzuschreiben in Swing.

Daher meine Frage ein AWT Applet spiel : Lieber in JApplet oder gleich JFrame?

gruß spin
 
Da Applets am austerben sind (aus guten Grund): Lieber JFrame. Kommt aber drauf an wo du das Programm benutzen willst.
 
Das Spiel soll auf den Clienten ausführ bar sein. Das heißt ich starte es später als .jar
Wenn ich es Online Stellen möchte, brauche ich natürlich ein Applet.

Aber das kann man ja zu Not immer noch um schreiben 😉
Ok danke für Info.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben