webForumDet fria alternativet
Logga in / Bli medlem

Använda Threads

Java

2 svar · 335 visningar · startad av Gein

Medlem sedan sep. 20005 700 inlägg
Frågan#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?

Medlem sedan maj 20012 237 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();
Medlem sedan juni 20008 205 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.

273 ms totalt · 4 externa anrop · v20260731065814-full.0bc6e834
131 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
131 ms — ändringar (db)