webForumDet fria alternativet

Skapa nya trådar via objekt

3 svar · 339 visningar · startad av Blårand

BlårandMedlem sedan jan. 20032 356 inlägg
#1

Jag skapar ett objekt genom att göra följane anrop. I följande fall skapar jag objektet genom att trycka på en knapp:

kollaPost check = new kollaPost();

Anropet skapar upp objektet, och kör koden i en egen tråd. Detta fungerar bra till jag trycker på knappen ytterliggare en gång.
Nästa gång jag trycker på knappen, så fungerar det inte eftersom objektet och tråden redan finns.
Hur löser man bäst detta? Finns det något sätt att ta död på objektet då jag inte vill skapa ett helt nytt objekt för varje knapptryck. Eller kan jag återanvända objektet på något vis, samtidigt som jag alltid kör anropet i en egen tråd?

public class kollaPost implements Runnable{
        public kollaPost()
    	{      		   	    	
        	Thread thread = new Thread(this);
        	thread.start();
        }

	
		public void run()
		{	 		
			try{...mer kod...mer kod...

Försökte även med följande variant där jag skapar objektet i ett tidigt skede, och sedan anropar objektets metod när jag skapar upp tråden. Men inte heller detta fungerade, utan man får felmeddelande om att tråden redan existerar när man trycker på knappen vid det andra tillfället.

public void koll(){
    		Thread thread = new Thread(this);
        	thread.start();
    	}

public void run()
		{	 		
			try{...mer kod...mer kod...

Någon som har tid och möjlighet att förklara hur jag bäst löser detta problem?

spangoMedlem sedan juni 20008 205 inlägg
#2

Låt bli att new:a kollaPost vid varje knapptryckning, lagra den som ett fält i händelsehanterarklassen istället.

public class KollaPostHandler implements ActionListener {

    private kollaPost checker = new kollaPost();

    public void actionPerformed(ActionEvent e) {
        checker.koll();
    }

}

Sen får vi helt enkelt hålla reda på om det är en tråd igång eller inte när vi kör metoden kollaPost():

public class kollaPost implements Runnable{

	/** Something to hold locks on */ 
	private final Object runningLock = new Object();

	/** Is run() executing? */
	private boolean running = false;

        public kollaPost(){      		   	    	
		synchronized (runningLock) {
			if (!running) {
				Thread thread = new Thread(this);
		        	thread.start();
				running = true;
			}
		}
        }

	public void run(){	 		
		// gör saker
		// ...
		// och till sist:
		synchronized (runningLock) {
			running = false;
		}
	}
}

Det är viktigt att all kod som gör nåt med running-variabeln är synkroniserad på runningLock för att förhindra trådkrockar.

Och när vi ändå är igång, lite gnäll ;) Metoder ska inte heta samma sak som klasserna de ligger i, och identifierare ska inte ha svenska namn, och klassnamn ska börja med stor bokstav, plus att klasser normalt ska vara substantiv (medan interfaces gärna får vara adjektiv), och metoder kan vara verb. Så, metoden "kollaPost" i "kollaPost" borde heta typ "checkPosts" och ligga i klassen "PostChecker" istället :)

BlårandMedlem sedan jan. 20032 356 inlägg
#3

Tack för svaret!

Har provat din kod, men tyvärr fungerade det inte fullt ut, utan när man kommer till public void run i klassen kollaPost, och ska tugga igenom koden...

public void run()
		{	 		
			try{...mer kod...mer kod...

...så kastar koden ur sig exception(et) already opened.

Det funkar en gång, men inte andra gången tyvärr.

BlårandMedlem sedan jan. 20032 356 inlägg
#4

Hej!

Löste problemet på egen hand.
Det var inte tråden som var problemet som jag trodde, utan att jag i tråden försökte använda en connection som redan var öppen. Därav felmeddelandet already opened, som jag tolkade var kopplat till själva tråden.

Lade in kodsnutten serverConn.close();, så löste sig problemet eftersom det var den connection som felmeddelandet relaterade till och inte till själva tråden.

Tack för din hjälp. Ska försöka lägga dina kommentarer på minnet vad gäller klassnamn, metoder och namnsättning, så att koden blir lite mer strukturerad.

Tack för hjälpen!

132 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)