Guten Tag Zusammen,
ich habe eine Frage zu Threads.
Ich möchte eine Prüf-Aufgabe möglichst breit parallelisieren. Dazu erstelle ich für jede Prüfung (Jede Datei in einem bestimmten Verzeichnis wird untersucht, ob sie schon in einer Datenbank eingetragen ist.) einen eigenen Thread. Damit nicht zu viele Threads parallel auf die Datenbank zugreifen pausiere ich alle Threads >50 bis die Anzahl der Threads wieder unter 50 fällt.
Das prüfe ich mit
Das klappt auch (was das pausieren angeht). Leider geht die Zahl der Threads aber nicht wieder herunter. Es scheint, dass die Threads nicht wieder beendet werden. Nach meinem Verständnis wird ein Thread doch beendet, wenn die run-Methode ohne Fehler durchgelaufen ist, oder?
Hier mal der Code:
[Java]
public class SubCrawler extends Thread{
DIRSlicer slicer = new DIRSlicer();
File[] files2;
@Override public void run()
{
while(Thread.activeCount()>50){
try {
Thread.sleep(50);
System.out.println(Thread.activeCount());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i2 = 0; i2 < files2.length; i2++){
if (files2[i2].isDirectory()) {
System.out.println("Unterordner wird in dieser Schleife nicht berücksichtig");
} else {
System.out.println("Datei wird überprüft: "+files2[i2].toPath());
slicer.slicer(files2[i2].toPath(), false);
}
}
System.out.println("<<<<<<<<<<<<<<<<<<<<<Thread beendet"+Thread.activeCount());
}
public void start(File[] listFiles) {
super.start();
files2 = listFiles;
System.out.println("*************Neuer Thread gestartet: "+Thread.activeCount());
}
}
[/code]
In der Konsole bekomme ich dann auch die entsprechende Meldung "Thread beendet". Aber die Anzahl, die Thread.activeCount() zurückliefert bleibt oben.
Das passt auch zu der Menge an Speicher, die die Anwendung schluckt.
Was mache ich falsch?
Vielen Dank für eure Hilfe.
Sebix
ich habe eine Frage zu Threads.
Ich möchte eine Prüf-Aufgabe möglichst breit parallelisieren. Dazu erstelle ich für jede Prüfung (Jede Datei in einem bestimmten Verzeichnis wird untersucht, ob sie schon in einer Datenbank eingetragen ist.) einen eigenen Thread. Damit nicht zu viele Threads parallel auf die Datenbank zugreifen pausiere ich alle Threads >50 bis die Anzahl der Threads wieder unter 50 fällt.
Das prüfe ich mit
Java:
Thread.activeCount()
Das klappt auch (was das pausieren angeht). Leider geht die Zahl der Threads aber nicht wieder herunter. Es scheint, dass die Threads nicht wieder beendet werden. Nach meinem Verständnis wird ein Thread doch beendet, wenn die run-Methode ohne Fehler durchgelaufen ist, oder?
Hier mal der Code:
[Java]
public class SubCrawler extends Thread{
DIRSlicer slicer = new DIRSlicer();
File[] files2;
@Override public void run()
{
while(Thread.activeCount()>50){
try {
Thread.sleep(50);
System.out.println(Thread.activeCount());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i2 = 0; i2 < files2.length; i2++){
if (files2[i2].isDirectory()) {
System.out.println("Unterordner wird in dieser Schleife nicht berücksichtig");
} else {
System.out.println("Datei wird überprüft: "+files2[i2].toPath());
slicer.slicer(files2[i2].toPath(), false);
}
}
System.out.println("<<<<<<<<<<<<<<<<<<<<<Thread beendet"+Thread.activeCount());
}
public void start(File[] listFiles) {
super.start();
files2 = listFiles;
System.out.println("*************Neuer Thread gestartet: "+Thread.activeCount());
}
}
[/code]
In der Konsole bekomme ich dann auch die entsprechende Meldung "Thread beendet". Aber die Anzahl, die Thread.activeCount() zurückliefert bleibt oben.
Das passt auch zu der Menge an Speicher, die die Anwendung schluckt.
Was mache ich falsch?
Vielen Dank für eure Hilfe.
Sebix