Announcement

Collapse
No announcement yet.

noblocking Wait auf Variable && inputstream in dann outputstream out

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • noblocking Wait auf Variable && inputstream in dann outputstream out

    Hallo,

    Da ich gard eine Java Anwendung schreiben muss, habe ich zwei kurze fragen, die mir nicht klar sind (da ich sonst nicht mir Java arbeite):

    1)
    Ich würde gerne ein nonBlocking weit haben, das irgendwie so aus sieht:
    nonBlockingWaitFor(obServeVariable, Timeout);
    damit soll der Thread nichtblockierend in den suspend state wechsel,
    bis entweder: der Timeout (sprich die Zeit abläuft) eintritt
    oder die Variable sich ändert.

    Geht sowas? Wie?


    2)
    Ich habe einen InputStream und einen OutputStream.
    Wenn ich in den OutputStream etwas reinschreibe, sollte "Zeitnahe" auf dem InputStream etwas herien kommen.

    Jetzt will ich die beiden in eine Methode nach dem Format: public boolean TransmitOutIn(String outputMsg, String* inputMsg, int TimeOutUSeconds = 500);
    Dieser Methode übergibt man:
    - den outputString der gesendet wird
    - eine Referenz auf einen String der die zurück erhaltende Nachricht beinhalten soll (so erfolgreich)
    - rückgabe wert des Methode sollte dann ein Indikator sein, ob tatsächlich ein neuer wert zurück erhalten wurde (innerhalb einer gewissen Zeit = Timeout)

    Geht soetwas? Wie kann man das sauber implementieren?

    Habe hierfür schon eine Class, die per Methode in den OutputStream schreiben kann und ein Event gefeuert wird, wenn etwas in den InputStream kommt.

    3)
    Da das mit dem Event Überwachen ja einen EigenenThread braucht, wie kann ich dafür sorgen, dass der solange läuft, bis ich das Programm beenden will.
    Ich denke dabei an ein (siehe 1) non blocking wait auf einer globalen Variable - aber wie implementiert man eine Globale Variable in Java sauber?

  • #2
    1) verstehe ich nicht -> Java kennt kein suspend in Threads (mehr).
    2) verstehe ich auch nicht ganz (was bedeutet das * in dem Methodenaufruf; Zeiger?; =500 -> Methoden können keine festen Parameter haben)
    schau dir das Listenerkonzept an
    eine Referenz auf einen String der die zurück erhaltende Nachricht beinhalten soll (so erfolgreich)
    Java kennt keine Zeiger, keine globalen Variablen


    3) Grundsätzlich wird ein Thread wie folgt aufgebaut

    [highlight=java] public class DB4OThread extends Thread
    {
    private boolean running=false;

    public DB4OThread()
    {
    }

    @Override
    public void run()
    {
    running=true;
    while(running)
    {
    //tu was
    }
    //Thread wird beendet
    }

    public void kill()
    {
    running=false;
    }

    }

    [/highlight]


    Er wird mit start gestartet und mit kill beendet.Hier kannst du natürlich einen Timer einbauen, der nach einer bestimmten Zeit den Thread beendet. Weiterhin kannst du über einen Setter irgendwelche Variablen setzen und den Thread damit auch beenden


    [highlight=java] public class NewBean implements Serializable
    {


    private PropertyChangeSupport propertySupport;

    public NewBean()
    {
    propertySupport=new PropertyChangeSupport(this);
    }


    public void addPropertyChangeListener(PropertyChangeListener listener)
    {
    propertySupport.addPropertyChangeListener(listener );
    }

    public void removePropertyChangeListener(PropertyChangeListene r listener)
    {
    propertySupport.removePropertyChangeListener(liste ner);
    }

    }

    [/highlight]
    Die Klasse implementiert einen Listener. Wer was von der Klasse wissen will, meldet sich an. Wenn die Klasse den angemeldeten was mitteilen will, setzt sie ein "propertySupport.fire..." ab. Das Beispiel stammt aus den Beans....
    Zuletzt editiert von Christian Marquardt; 14.11.2013, 20:52.
    Christian

    Comment


    • #3
      Ergänzung: In Java werden zwar überall Refernzen übergeben, das gilt aber nicht für die Klasse String (immutable, const & in C++)
      Christian

      Comment


      • #4
        Originally posted by Christian Marquardt View Post
        1) verstehe ich nicht -> Java kennt kein suspend in Threads (mehr).
        Das ist aber schade ...
        wie warte ich dann auf etwas, ohne Ressourcen (CPU Zeit) zu verschwenden?
        Ich kenne das eben aus C ...

        Originally posted by Christian Marquardt View Post
        2) verstehe ich auch nicht ganz (was bedeutet das * in dem Methodenaufruf; Zeiger?; =500 -> Methoden können keine festen Parameter haben)
        schau dir das Listenerkonzept an

        Java kennt keine Zeiger, keine globalen Variablen
        Soll ein optionaler Parameter sein ... (mit dem =500)
        Hmm ich weiß auch nicht wie cih die Frage anders ausdrücken soll.

        Ich habe eben einen InputStream und einen OutputStream von einem SerialPort. (java.io)
        Schreiben ist einfach OutputStream.write(("Die Nachricht geht raus\n").getBytes());
        Beim lesen warte ich aber auf das "SerialPortEvent.DATA_AVAILABLE" Event. Und aknn dann die Bytes lesen
        InputStream.read(meinInputByteArray);

        Das ist zwar fein, ich will (also eigentlich muss ich) das in eine Methode packen,
        der gebe ich den Output string und erhalte als rückgabe den empfangenen.
        Allerdings soll die Methode natürlich nicht unendlich blocken, wenn das Event doch nicht kommt.
        Außerdem muss ich wissen, ob die daten neu sind oder es sich um die alten handelt.

        Originally posted by Christian Marquardt View Post
        [highlight=java]
        @Override
        public void run()
        {
        running=true;
        while(running)
        {
        //tu was
        }
        //Thread wird beendet
        }
        [/highlight]
        Und wie sieht das "//tu was" aus, wenn es nicht zu tun gibt, außer dem warten auf Events?
        Sonst gibt es da eben sowas wie ein wait oder sleep ... die verbrauchen normalerwieße keine Ressourcen.

        Originally posted by Christian Marquardt View Post
        Er wird mit start gestartet und mit kill beendet.Hier kannst du natürlich einen Timer einbauen, der nach einer bestimmten Zeit den Thread beendet. Weiterhin kannst du über einen Setter irgendwelche Variablen setzen und den Thread damit auch beenden
        Ok, das mit den Threads in den HighLevel Sprachen verstehe ich scheinbar nicht ganz ....
        Wenn ich in einer Klasse einen Thread Starte, hat der dann doch zugriff auf die Variablen dieser Klasse?
        Oder wie werden die ergebnisse nach dem beenden des Threads am "schönsten" zurück gegeben?


        Originally posted by Christian Marquardt View Post
        Die Klasse implementiert einen Listener. Wer was von der Klasse wissen will, meldet sich an. Wenn die Klasse den angemeldeten was mitteilen will, setzt sie ein "propertySupport.fire..." ab. Das Beispiel stammt aus den Beans....
        Naja, Events ist was ich _nicht_ brauche


        Danke für deine Erklärungen!

        Comment


        • #5
          "wie warte ich dann auf etwas, ohne Ressourcen (CPU Zeit) zu verschwenden?"
          mit der Schleife; ist docht wurscht, ob du sie machst oder der Code einer Funktion wie sleep oder wait

          "Und wie sieht das "//tu was" aus, wenn es nicht zu tun gibt, außer dem warten auf Events?"
          Du musst doch das Event irgendwie implementiert haben? Als Beispiel der boolean, wird der durch das "Event" kill geändert, beendet sich die Schleife und der Thread. Ein Thread ist eine normale Klasse, der können per Getter/Setter Daten übergeben werden / sie kann sie rausgeben(Ergebnisse). Wenn die Klasse Primzahlen berechent und du irgnedwann kill aufrufst, kannst du bsp. mit der Methode getHoechsteZahl die letzte berechnete Zahl auslesen
          Christian

          Comment


          • #6
            Originally posted by Christian Marquardt View Post
            "wie warte ich dann auf etwas, ohne Ressourcen (CPU Zeit) zu verschwenden?"
            mit der Schleife; ist docht wurscht, ob du sie machst oder der Code einer Funktion wie sleep oder wait
            Also bei C eben nicht!
            Da nennt sich das eben Busy Wait, und belegt die CPU.

            Comment


            • #7
              Vielleicht mal konkret deine Threadklasse zeigen und gezielt beschreiben was passieren soll.

              Meine C/C++ Zeit ist zwar schon länger her, aber an einen Befehl der auf etwas wartet und keine CPU-Zeit benötigt, kann ich mich nicht erinnen...Jaja das Alter, aber halt ich auch für wenig mögich. Schließlich muss auf Maschinencodeebene die Zeit oder Variablenstatus innerhalb einer Schleife geprüft werden.
              Christian

              Comment

              Working...
              X