Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hallo,
ich möchte gerne überprüfen, ob eine Bilddatei unter einer bestimmten URL im Internet vorhanden ist. Ich habe folgende Version momentan programmiert:
Nun habe ich allerdings ein Problem mit der Laufzeit. Die Methode an sich funktioniert wie gewünscht. Aber da ich die Methode in einer While Schleife zehntausende Male aufrufen will, suche ich nach einer schnelleren Möglichkeit, zu überprüfen, ob eine Bilddatei im Internet vorhanden ist. Geht es eventuell schneller und wenn ja, wie? Weil so muss natürlich immer erst auf die Exception gewartet werden.
Zusätzlich könntest du mit Multithreading dein Programm beschleunigen. Weil es ziemlich lange dauert bis so eine TCP Verbindung gebaut ist und Daten gesendet wurden, schläft dein Programm die ganze Zeit. Mit mehreren Threads könntest du mehrere URLs gleichzeitig abfragen, wahrscheinlich könntest du damit dein Programm locker 10 mal schneller machen.
Google sollte dir sagen können, was genau ein Thread ist und wie man ihn verwendet.
Wenn alle Bilder auf dem selben Server liegen, dann sollte auch der Einsatz von HTTP 1.1 deutlich beschleunigen, da nicht immer die Verbindung neu aufgebaut werden muss. Ich weiß nicht ob URL das macht, HTTPClient von Apache kann es aber iirc.
Hallo,
ich habe momentan leider probleme bei der Umsetzung:
Klasse A (in der Main Methode):
Die Variablen sind natürlich alle deklariert und instanziert.
Java:
while (nr != 4000){
nr++;
Thread_Images thread = new Thread_Images();
thread.start();
System.out.println(nr);
}
Und der Thread dazu:
Java:
public class Thread_Images extends Thread{
public void run(){
if (getImages.istVorhanden("http://url_"+getImages.profileid+"_"+getImages.nr+"_n.jpg")){
System.out.println("Erwischt"+getImages.nr);
}
else {
System.out.println("not");
}
}
}
Was mache ich falsch beim Multithreading? Wie muss es richtig gehen?
Mit deinem gegebenen Code erzeugst du momentan 4000 Threads, die alle ihre run()-Methode abarbeiten und sich dann wieder beenden.
Damit die Threads auch weiterlaufen, ist der zu wiederholende Code in run() in eine (Endlos-)schleife zu packen.
Hallo,
kannst du mir zeigen, wie der Code dann aussehen muss? Muss ich 4000 Threads für Multithreading erstellen oder wie mache ich das? Ich weiß leider nicht, wie ich es umsetzen muss.
Danke schonmal dafür.
Bei 4000 Threads hast du solch einen Overhead, dass vermutlich garnichts mehr läuft. So zwischen 10 und 20 Thread sollte ein guter Wert sein.
Jeder Thread sollte eine Schleife haben, in der er eine URL nach der anderen abfragt. Um rauszufinden welcher Thread welche URLs verarbeitet, kannst du z.B. eine Methode "public synchronized URL nextURL(){...}" schreiben, welche von allen Threads aufgerufen wird. Die Methode muss in irgendeinem Objekt sein, das allen Threads bekannt ist (pass auf, dass du nicht eine URL mehrfach abfragst, das wäre ziemlich sinnlos).
[Edit: Das kann irgendwie so aussehen
Java:
public class Test{
private volatile int nr = 0;
public void startThreads(){
for(int i = 0; i < 20; i++){
Thread thread = new Thread(){
public void run(){
URL next;
while( (next = nextURL() ) != null ){
... url lesen ...
System.out.println("url " + next + ": existiert/existiert nicht");
}
}
};
thread.start();
}
}
public synchronized URL nextURL(){
return new URL("http://url" + (nr++) + ".jpg");
}
}
Hier eine Lösung mit while(true) anzubieten ist glaube ich nicht richtig. Wieso soll ein Thread ewig leben, nachdem er seine Aufgabe abgeschlossen hat?