# Netbeans Warning bei Thread.sleep in Schleife



## hüteüberhüte (27. Sep 2012)

Hallo, habe folgendes Programm:


```
import java.util.GregorianCalendar;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        GregorianCalendar gc_to = new GregorianCalendar(
                Integer.parseInt(args[0]),
                Integer.parseInt(args[1]),
                Integer.parseInt(args[2]),
                Integer.parseInt(args[3]),
                Integer.parseInt(args[4]));
        int index = 0;
        while (System.currentTimeMillis() <= gc_to.getTimeInMillis()) {
            // do something with index...
            Thread.sleep(60L * 1000L);
        }
    }
}
```

Es soll also jede Minute eine Aktion ausführen. Jetzt sagt mir Netbeans aber:

Warnung: Aufruf von Thread.sleep in Schleife

Was hat es damit auf sich? Wie sollte man es evtl. anders machen?

Grüße!


----------



## SlaterB (27. Sep 2012)

erster + zweiter Link zur Suche 'Warnung: Aufruf von Thread.sleep in Schleife'
java - Thread.sleep() in a while loop - Stack Overflow
multithreading - NetBeans / Java / New hint: Thread.sleep called in loop - Stack Overflow

viel mehr kann hier glaube ich kaum neues rauskommen, bei allem Vertrauen in dieses Forum 

wenn Schleifenabbruch von anderen Threads abhängt, dann lieber mit anderen Konstrukten dynamischer warten um sofort weiterzumachen,
wenn sleep() aber wirklich feste Pausen bedeuten soll, dann soweit ich denke keine Alternative


----------



## xehpuk (27. Sep 2012)

An deinem Konstrukt ist zumindest der letzte 
	
	
	
	





```
sleep()
```
-Aufruf unschön.

Beispiel:

Noch 170 Sekunden. Mach etwas und schlaf 60 Sekunden.
Noch 110 Sekunden. Mach etwas und schlaf 60 Sekunden.
Noch 50 Sekunden. Mach etwas und schlaf *unnötigerweise* 60 Sekunden.
Fertig.


----------



## hüteüberhüte (27. Sep 2012)

Danke, dass ganze Programm sieht so aus (vielleicht fällt euch ja noch etwas auf, was einfacher ginge):


```
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.GregorianCalendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    private static final Pattern[] pat = {
        Pattern.compile("<img src=\"(...)\""),
        Pattern.compile("<img src=\"(....)\""),
        Pattern.compile("<img src=\"(.....)\"")};
    private static final int[] indexes = new int[pat.length];

    public static void main(String[] args) throws InterruptedException, IOException {
        GregorianCalendar gc_to = new GregorianCalendar(
                Integer.parseInt(args[0]),
                Integer.parseInt(args[1] + 1),
                Integer.parseInt(args[2]),
                Integer.parseInt(args[3]),
                Integer.parseInt(args[4]));
        while (System.currentTimeMillis() <= gc_to.getTimeInMillis()) {
            BufferedReader br = new BufferedReader(new InputStreamReader(new URL("http://www.example.com/").openStream()));
            String s;
            while ((s = br.readLine()) != null) {
                for (int i = 0; i < pat.length; i++) {
                    Matcher m = pat[i].matcher(s);
                    if (m.find()) {
                        System.out.println("Speichere " + m.group(1) + " ...");
                        BufferedInputStream bis = new BufferedInputStream(new URL(m.group(1)).openStream());
                        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(String.format("%d_%04d.jpg", i + 1, indexes[i]++)));
                        int b;
                        while ((b = bis.read()) != -1) {
                            bos.write(b);
                        }
                        // Muss ich hier bos.flush() aufrufen?
                        bis.close();
                        bos.close();
                        break;
                    }
                }
            }
            br.close();
            Thread.sleep(60L * 1000L);
        }
    }
}
```

Im Prinzip soll eine Website aufgerufen werden. Sie beinhaltet Bilder, die dann geladen+gespeichert werden sollen. Das soll jede Minute geschehen, bis ein bestimmter Zeitpunkt erreicht ist. Die Anwendung soll sofort beendet werden, wenn ein Fehler (z.B. beim Lesen/Schreiben) auftritt.

Muss ich in Zeile 41 flush() aufrufen?

Dass das Programm nach dem letzten Lesen/Schreiben noch 60 Sekunden wartet, ist nicht schlimm. Wichtig ist nur, dass mindestens 60 Sekunden zwischen dem erneutem Lesen/Schreiben gewartet wird.


----------



## SlaterB (27. Sep 2012)

ein close() sollte auch immer flush()en, also an sich nicht nötig,

mit der Netbeans-Warning kann dein Programminhalt praktisch nichts zu tun haben


----------

