Archief - [PROG]Java Vraag over Thread

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

horse_99

Legacy Member
Hallo,

Ik heb een klasse Decoder die dient om rare tekstbestanden te decoderen naar een database. Nu zou ik hier een Thread van willen maken, omdat je bij grotere bestanden het gevoel krijgt dat het programma bevriest, omdat de decodering dan wat langer duurt. Dit is wat ik heb tot nu toe:

Code:
class Decoder extends Thread {
    public Decoder() {
        this.start();
    }
    public void decode(File file) throws Exception {
        // Code voor het decoderen.
    }
}

Bij de constructor wordt de Thread meteen gestart en de methode run() wordt automatisch aangeroepen, dan is er de methode decode() die een bestand decodeert. Zo gebruik ik deze klasse in mijn programma (deze code wordt uitgevoerd wanneer men op een knop drukt):

Code:
Decoder decoder = new Decoder();
decode.decode(file);

Ik denk dat ik iets verkeerd doe, want de knop blijft ingedrukt tijdens het proces en je hebt nog altijd het gevoel dat het programma blijft hangen.

Weet iemand raad?

Alvast bedankt,
horse_99.

agent #2

Legacy Member
Je roept je methode start op in je constructor, daarom blijft hij daarin vastzitten tot die methode start is uitgevoerd.

Die code is trouwens verouderd. Je kan beter implements Runnable gebruiken ipv extends Thread.

In je klasse waar je je decoder oproept moet je dan een Threadpool maken.

Code:
class Decoder implements Runnable
{
     File f = null;

     Public Decoder (File f)
     {
           this.f=f;
     }
     Public void run()
     {
             //hier roep je maar je decodemethode op
     }
}


Code:
ExecutorService threadExecutor =
 			Executors.newCachedThreadPool();
try{
        Decoder dc = new Decoder(uw file hier);
        threadExecutor.execute(dc);
}
catch(IOException ioe)
{
        ieo.printStackTrace();
}
finaly
{
        threadExecutor.shutdown();
}

horse_99

Legacy Member
Bedankt, ik zal je voorbeeld eens proberen, maar heb toch nog een vraag erover: de methode run() in de Runnable interface mag géén exceptions gooien, terwijl mijn decode() methode dat wel doet. Hoe moet je zoiets dan oplossen?

agent #2

Legacy Member
in uw methode run() heb je wel een try/catch blok nodig. Die andere try/catch blok dient voor threadExecutor.

daigon

Legacy Member
Je kan evengoed

new Thread(new Decoder(uw file hier)).start();

Ik heb ooit een caching moeten maken van 10 threads die snmp commandos moesten versturen naar veel ipaddressen en heb ik ook zo opgelost omdat de ExecuterService een probleem gaf bij 100k verwerkingen. Ook al gebruikte ik ExecutorService.newFixedThreadPool(10);

forloRn_

Legacy Member
Call me crazy, maar de reden waarom het programma in de eerste post blijft hangen, is toch omdat decode() nog steeds wordt uitgevoerd in de originele thread en niet in de Decoder-thread?

Jiggy

Legacy Member
Threadpool? Denk niet dat hij zoveel last gaat hebben in multithreading als dit het enige is dat hij van plan is. Kzou gewoon thread maken met niet al te hoge priority (dan merkt ge er niet teveel van).
Heb net liggen testen die code en het verschil tussen de thread starten en de thread niet starten is maar 1 milliseconde.

Code:
import java.io.File;

public class Run {
	public static void main(String[]args) {
		Decoder d = new Decoder(new File("test.txt"));
		Thread t = new Thread(d);
                /** Set thread priority */
		t.setPriority(Thread.MIN_PRIORITY);
		t.start();
	}
}

class Decoder implements Runnable {
	private File file;
	public Decoder(File file) {
		this.file = file;
	}
	public void run() {
		try {
			decode(file);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void decode(File file) throws Exception {
        // Code voor het decoderen.
    }
}
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan