webForumDet fria alternativet

Använda Threads

2 svar · 335 visningar · startad av Gein

GeinMedlem sedan sep. 20004 849 inlägg
#1

Jag skulle behöva bli lite upplyst i hur man använder Threads i Java. I min main-funktion så behöver jag skapa ett objekt SimulationEngine och ett PastureGUI. Dessa två ska däremot köras i två olika threads och jag förstår inte hur jag använder Thread-klassen alls. Har läst på http://java.sun.com/j2se/1.3/docs/api/ om Thread men blev inte helt klok i skallen.

Har provat att skapa en ThreadPGUI.java med följande kod

public class ThreadPGUI extends Thread {
	private SimulationEngine simEngine;
	
	public ThreadPGUI(SimulationEngine simEngine){
		this.simEngine = simEngine;
	}
	
	public void run() {
		PastureGUI gui = new PastureGUI(this.simEngine, new Dimension(50,50));
		gui.start();
	}
}

och sedan i min main har jag följande:

SimulationEngine sim = new SimulationEngine();
ThreadPGUI t = new ThreadPGUI(sim);
t.start();

red Såg nu felet, skulle extenda Thread inte Runnable (såklart). Nu kompilerar det, men jag är fortfarande osäker på om de verkligen körs i olika threads... har jag gjort rätt?

jmeMedlem sedan maj 20011 967 inlägg
#2

Ett tips, Lägg till en while-loop med System.out.println("thread a") och en while-loop med System.out.println("Thread b") i respektive run()-metod. Då ser du, ifall båda trådarna körs samtidigt :)

Du kan antingen skapa en Thread-klass, genom att ärva från klassen Thread, eller implementera gränsnsittet Runnable.

Om din klass t ex redan ärver från JFrame, så kan du inte ärva från klassen Thread samtidigt, utan då måste du. antingen implementera gränssnittet Runnable, eller använda "anonymous classes", dvs:

new Thread()
{
	public void run()
	{
	
	}
}.start();
spangoMedlem sedan juni 20006 147 inlägg
#3

När man öppnar ett fönster sker det genom ett asynkront anrop, dvs det startar en egen tråd automagiskt. Du borde inte behöva fixa det själv. Hur som helst, en liten Thread-101:

När start() anropas anropar den i sin tur run(), som körs i en annan tråd. Därefter returnerar start() men run() fortsätter rulla tills det tar slut.

I en vanlig Threads run() anropas run() hos den Runnable man skickat in.

Om man i stället överskuggar run() i en Threadsubklass körs den som man vill.

Genererad på 370 ms · cache AV · v20260730165559-full.f96bc7eb