Threads Thread in While-Schleife nur einmal starten

Elorex

Neues Mitglied
Hallo,
ich habe zwei Threads, die zu einer bestimmten Zeit etwas machen sollen.
Das sollen sie aber nur machen, wenn eine Verbindung zum Internet besteht, da sie etwas downloaden sollen. Besteht die Internetverbindung nicht, aber die Zeit ist trotzdem erreicht soll der Thread so lange in die "Warteschleife" bis eine Internetverbindung besteht und dann tun, was er tun soll.
Währenddessen kann es passieren, dass Thread 2 ebenfalls seine Zeit erreicht und mit ihm das selbe geschieht.
Das klappt auch soweit ganz gut, jedoch wird die While-Schleife alle 30 Sekunden wiederholt, damit sich die Zeit aktualisiert um ggf. einen Thread auszuführen.
Da sich nach 30 Sekunden die Minute nicht geändert hat wird aber der selbe schon laufende Thread ein zweites mal ausgeführt, sodass zwei mal "Tu etwas!" und ggf. auch zwei mal "Tu etwas anderes!" in der Console ausgegeben wird, sobald eine Internetverbindung hergestellt wurde.

Gibt es eine Möglichkeit zu verhindern, dass der Thread ein zweites mal gestartet wird während er noch läuft, ohne die Aktualisierung der Zeit zu stoppen?

Hier mein Code, der ausgeführt im "Idealfall" beide Texte zwei mal ausgibt:

Java:
import java.io.IOException;
import java.util.Calendar;

public class Connection {
  
    public static void main(String[] args) throws IOException {

        while (true) {

            try {

                int minute = 0;

                Calendar rightNow = Calendar.getInstance();

                minute = rightNow.get(Calendar.MINUTE);

                final int Minuten = minute;

                Runnable Test1 = new Runnable() {

                    @Override
                    public void run() {
                        if (Minuten == 55) {

                            while (Internet() == false) {

                            }
                            System.out.println("Du hast Internet");
                        }
                    }
                };

                Runnable Test2 = new Runnable() {

                    @Override
                    public void run() {
                        if (Minuten == 56) {

                            while (Internet() == false) {

                            }
                            System.out.println("Du hast Internet!");
                        }
                    }
                };

                Thread Nummer1 = new Thread(Test1);
                Thread Nummer2 = new Thread(Test2);

                Nummer1.start();
                Nummer2.start();
           
                Thread.sleep(30000);
 
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    public static boolean Internet() {
        try {
            java.net.InetAddress.getByName("google.de");
            return true;
        } catch (java.net.UnknownHostException e) {
            return false;
        }
    }
}


Vielen Dank schon im Voraus,
Erik
 
Guten Abend,
ich würde es mit einer if Abfrage lösen.
Wenn du schon einen/zwei aktive threads hast dann erstell auch keinen neuen.
Die Variable kannst du in der Klasse, in der Main-Methode oder in dem Runnable definieren. Letzteres wäre mein Lösungsweg.
Allerdings würde das keinen Sinn machen in denen Fall, da du alles statisch machst - warum eigentlich?
Deshalb schau einfach nach ob deine Nummer1 und zwei noch laufen und wenn nicht starte sie.

Mit Thread.isAlive() kannst du das meine ich abfragen.
Oder probier mal anstatt Thread.sleep (int)
Nummer1.join();
Nummer2.join();
Dann wartet deine Main-Methode darauf, dass sich die beiden Threads schließen und erstellt, wenn die beiden beendet sind zwei neue.
Ich weiß nicht genau wo du hin willst mit dem Test aber beides müsste dein Problem lösen.

Für deinen nächsten Quell-Code würde ich dich bitten alle Variabel- und Methodennamen klein zu schreiben das vereinfacht das lesen.

LG
 
Dein Code ist unglaublich Komplex und unübersichtlich für das, was du tun willst.

Du startest die Threads alle 30 sek, (uU also fast 120 Threads), nur um dann in diesen zu prüfen, ob sie gestartet werden sollen?
Warum das nicht einfach umdrehen, und den Thread nur starten, wenn er gestartete werden muss?

Und warum nicht, um dir das ganze noch leichter zu machen, dafür vorgesehenen Klassen benutzen - zB Timer, damit kann man eine Aufgabe zu einem bestimmten Zeitpunkt starten lassen. (Oder
ScheduledExecutorService, ist etwas mehr Aufwand, aber auch besser.)
 

Neue Themen


Zurück
Oben