Threads Startschwierigkeiten

St3f

Mitglied
Hallo!

Bin eben auf das Forum gestoßen und hoffe Ihr helft mir weiter :)

Ich verstehe einfach die Threadprogrammierung nicht. :bloed: Eigentlich wollte ich eine Kuckucksuhr mit Swing-GUI (in der auch bis auf den Kuckuck bereits alles läuft) erstellen. Zur Vereinfachung und um die Funktionsweise der Threads besser zu verstehen, habe ich mir aber erstmal eine Klasse erstellt, die mir jede Sekunde die aktuelle Zeit auf der Kommadozeile ausgibt. Also so:

Java:
import java.util.Date;

public class Timer extends Thread{

    private Alarm alarm;
    
 	public void run() {
		while(true){
			try{ 
				Thread.sleep(1000); //warte eine Sekunde
			}
			catch (Exception e){}
			System.out.println(new Date().toString());
		}	
     }
}

Und der Alarm:
Java:
public class Alarm extends Thread{
	     
	 	public void run() {
				try{ 
					this.wait(); //warte, ist natürlich noch falsch.
				}
				catch (Exception e){}
				// wenn benachrichtigt, verstehe aber nicht, wie ich das umsetze.
				System.out.println("Alarm!");
			}	
	     }
	}


Es ist wirklich total blöde, aber ich komme einfach nicht weiter damit. Wie ist eine Kommunikation zwischen den beiden hinzubekommen, sodass der Alarm immer zu einer bestimmten Uhrzeit (also Minuten==00) aufgerufen wird? Also, wie ich das hinbekomme, dass es immer zu einer bestimmten Zeit passiert, weiß ich schon, aber wie läuft das mit den Threads?

???:L

Ach so, Beispiele in diversen Büchern hab ich mir schon angesehen, aber irgendwie fällt der Groschen einfach nicht bei mir.
 

Xeonkryptos

Bekanntes Mitglied
Auf anhieb fällt mir etwas mit den PipedStreams ein, da ich diese aber nicht kenne und mit ihnen noch nicht gearbeitet hab, kann ich wenig dazu sagen.

Eine Idee wäre einfach eine Variable in der Main-Klasse zu basteln, die die Werte zugewiesen bekommt und ausgelesen werden können, wodurch dein Kriterium des Bekanntmachens und darauf reagieren zu können gelöst sein sollte, doch beachte die Gefahr bei Multithreading!
 

ttmgot

Mitglied
kannst du eine Methode schreiben, die ein Date-Objekt bekommt, und dann, wenn das Datum einer bestimmten Spezifikation entspricht, Alarm ausgibt? Die könntest du ja dann wahrscheinlich in der run-Methode aufrufen (bin jetzt auch nicht der große Java-Experte, daher nicht sauer sein, wenns nicht klappt)
 

c_sidi90

Top Contributor
Vorausgesetz ich habe deine "Frage" richtig verstanden, vertehe ich garnicht ,wieso du 2 Threads benötigst. Du hast einen Thread welcher prüft, ob der Zeitpunkt für den Alarm eingetroffen ist. Wenn dies der fall ist, rufe die Methode alarm() auf. So würde ich es machen.

Vorher deklarierst du eine Date-Variable mit passendem Zeitformat und prüfst nach jedem Durchlauf deines Threads in einer if Abfrage ob das aktuelle Datum deiner vorher deklarierten Variable gleicht, wenn ja, löse den Alarm aus.
 

St3f

Mitglied
Danke schonmal für die Antworten! Werde mal weiterprobieren, sobald ich wieder dazu komme.

Vorausgesetz ich habe deine "Frage" richtig verstanden, vertehe ich garnicht ,wieso du 2 Threads benötigst. Du hast einen Thread welcher prüft, ob der Zeitpunkt für den Alarm eingetroffen ist. Wenn dies der fall ist, rufe die Methode alarm() auf. So würde ich es machen.

Ich hab zwei Threads weil ich ja auch jede Sekunde die Zeit auf der Konsole ausgeben will. Das hat vor allem damit zu tun, dass es in meiner Endanwendung eine analoge Uhr (SWING) ist, bei der ja dann jede Sekunde repaint() aufgerufen werden muss. Es ist mir nur nicht klar, wie ich die Info an den Alarm Thread weitergebe, also wie wecke ich ihn zu jeder vollen Stunde und lasse ihn dann wiederschlafen?
 

T7V

Aktives Mitglied
Ich hätte es andersrum gemacht. Damit meine ich du erzeugst beim starten deiner Anwendung ein Objekt von Timer und übergibst dann das an deinen Alarm.
Dann könntest du einfach in Timer eine Variable erstellen und diese in Alarm überprüfen.

In etwa so:

Java:
public class Alarm extends Thread{

  Timer timer;

  public Alarm(Timer t){ //Übergabe im Konstruktor
    
     timer = t;
  }
         
  public void run() {

     while(true){
       if( timer.minute == 0) System.out.println("ALARM");

      this.sleep(50000); 
      //wenn nur die minuten geprüft werden
      
    }       
  }
}

Generell ist das mit der Variable aber fehleranfällig.
 

T7V

Aktives Mitglied
Du kannst den Thread auch mit wait() unterbrechen und mit resume() fortfahren alssen.
(Ist aber auch nicht sicher, da Deprecated.)
das sähe in deinem fall so aus:

Java:
import java.util.Date;
 
public class Timer extends Thread{
 
  private Alarm alarm;
    
    public void run() {
        alarm.wait();
        while(true){            
            try{ 
                Thread.sleep(1000); //warte eine Sekunde
            }
            catch (Exception e){}
            System.out.println(new Date().toString());
        }  
        if(minute == 0) alarm.resume();
     }
}
Da aber Alarm nur einmal ausgeführt wird (du hast ja keine Schleife) ist für Alarm ein Thread überflüssig.
 

St3f

Mitglied
@T7V: Danke für die Erklärung, ich glaube jetzt kapier ich's!

Es stimmt schon, dass ich für einen einzigen Alarm keinen Thread brauche. Ich wollte aber dem Alarm auch noch die Stundenzahl übergeben, bzw. aus dem Timer-Objekt auslesen, und dann immer wie bei ner Kuckucksuhr jede Sekunde so oft einen Ton ausgeben lassen wie es gerade Stunden sind. Dafür bräuchte ich schon einen eigenen Thread, oder auch nicht? ???:L
 

timbeau

Gesperrter Benutzer
Dann kannst du aber einfach einem Thread der einen Ton ausgibt, die Anzahl an Sekunden übergeben.

Z.B. mit Runnable
 

Ähnliche Java Themen

Neue Themen


Oben