tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Fabio Hellmann
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
346
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Taramsis Taramsis ist offline Mitglied
    Registriert seit
    May 2007
    Beiträge
    11
    Ich habe einen MATLAB-Server der Anfragen über Java an MATLAB übergibt. Da MATLAB immer nur eine Anfrage bearbeiten kann, habe ich eine MASTER/Slave Serverstruktur überlegt.
    D.h. der Master bekommt die Anfragen und leitet diese an die Slave Server weiter.

    Könnte ich auch hier den "newSingleThreadExecutor()" verwenden?
    (siehe auch http://www.tutorials.de/java/379845-...r-threads.html)

    D.h. wären zwei SlaveServer verfügbar, müßte die Warteschlange ja nicht immer nur ein Thread zulassen , sondern zwei!
     

  2. #2
    Taramsis Taramsis ist offline Mitglied
    Registriert seit
    May 2007
    Beiträge
    11
    Ich brauche eigentlich nur eine Warteschlange in denen die Threads pausiert und warten bis sie herausgenommen und aktiviert werden.

    Also etwas in der Form:

    Klasse Network:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
     
    public static Queue q = new LinkedList();
     
     public void listen() {
           try {
                serverSkt = new ServerSocket(port);
                alive=true;
                new NetworkSlaveServerStatus(this).startThread();
                
                while(alive){
                    Socket skt = serverSkt.accept();
                    NetworkThread netThread = new NetworkThread(skt,this);  //hier werden die Anfragen erstellt
                    q.add(netThread); 
                    
                    synchronized(netThread){
                        while(getSlave1Status()|getSlave2Status() == true){
                            q.remove();
                            netThread.proceed(); // geht natürlich nicht soll nur die Idee darstellen
                        }
                    }
                }           
            }
     
            catch (IOException ex) {
            }
        }

    Klasse NetworkThread:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
     
    private boolean threadStatus = true;
     
    public void run() {
     
    //....
     
    synchronized (this){
                while(threadStatus) {
                    try {
                        wait();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(NetworkThread.class.getName()).log(Level.SEVERE, null, ex);
                    }
     
                }
            }
    }
     
    //....
     
    public void pause() {
          threadStatus = true;
        }
     
        public void proceed() {
          threadStatus = false;
          notify();
        }

    Wie kann man jetzt einen bestimmten Thread aus in und aus einer Warteschlange einfügen/entnehmen?
     

  3. #3
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,
    was mich an dieser Stelle mal interessiert, warum arbeitest du mit Threads, wenn du diese eh nur hintereinander weg laufen lassen willst. Wenn du immer nur 1 Thread am laufen hast und dann wartest bis dieser fertig ist, kannst du das auch ohne Threads realisieren. Oder sehe ich das falsch?

    Gruß

    Fabio
    Geändert von Fabio Hellmann (06.09.11 um 14:54 Uhr)
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  4. #4
    Taramsis Taramsis ist offline Mitglied
    Registriert seit
    May 2007
    Beiträge
    11
    Zitat Zitat von Fabio Hellmann Beitrag anzeigen
    warum arbeitest du an mit Threads, wenn du diese eh nur hintereinander weg laufen lassen willst. Wenn du immer nur 1 Thread am laufen hast und dann wartest bis dieser fertig ist, kannst du das auch ohne Threads realisieren. Oder sehe ich das falsch?
    Ein Kurzes Beispiel zur Erläuterung:
    Der MasterServer bekommt ständig Anfragen von irgendwelchen Clients. Es sollen mindestens zwei Slaveserver verfügbar sein, die diese Anfragen bearbeiten können. Nach der Bearbeitung sollen die Antworten zurück an den Masterserver, der diese an die Clients zurückschickt.
    Somit würden sich Threads, denke ich am besten eignen.
     

  5. #5
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Dann würde ich das aber von der Master-/SlaveServer-Client-Struktur ein bischen ändern. Wenn ich das bei dir richtig verstehe dann sieht das Design von dir momentan so aus, dass dann immer nur 1 SlaveServer am arbeiten ist.

    Warum machst du es nicht so, dass du x-Anzahl von SlaveServern einsetzen kannst/könntest. Ich würde das ungefähr so realisieren:

    Der MasterServer bekommt 2 Queues (eine für den Empfang von Requests und eine zum Versand): (Pseudocode)
    Code :
    1
    2
    
    Queue anfragen = new Queue();
    Queue rückgabe = new Queue();

    In diesen Queues speicherst du einmal die Anfragen in einem Objekt mit der jeweiligen Client-Zugehörigkeit. Z.B. so: (Pseudocode)
    Code :
    1
    2
    3
    4
    
    class Request {
       Client client;
       Object rückgabeWert;
    }
    In dem Object rückgabeWert speicherst du den Wert ab, den dir dein Thread (Slaveserver) einträgt. Sobald ein Request-Objekt in der Queue ist, wird ein Slaveserver gestartet, an diesen du das Request-Objekt übergibst - z.B. über den Konstruktor. Wenn der SlaveS. den Request abgearbeitet hat, dann wird er das RequestObject an den MasterServer zurückgeben und in die Rückgabequeue stecken. Diese muss dann natürlich auch vom MasterS. abgearbeitet werden.

    Ich hoffe das war soweit verständlich. Falls nicht, dann frag einfach nach.

    Gruß

    Fabio
    Taramsis bedankt sich. 
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  6. #6
    Taramsis Taramsis ist offline Mitglied
    Registriert seit
    May 2007
    Beiträge
    11
    Zitat Zitat von Fabio Hellmann Beitrag anzeigen
    Dann würde ich das aber von der Master-/SlaveServer-Client-Struktur ein bischen ändern. Wenn ich das bei dir richtig verstehe dann sieht das Design von dir momentan so aus, dass dann immer nur 1 SlaveServer am arbeiten ist.
    Ja, stimmt. Das ist war für den zweiten Schritt gedacht! Ich wollte es erstmal zum laufen bringen! Ich wollte dann für jeden SlaveServer einen WorkerThread erstellen, der aus der Queue die AnfrageThreads holt. (natürch wäre dies ein kritischer Abschnitt)

    Zitat Zitat von Fabio Hellmann Beitrag anzeigen
    Sobald ein Request-Objekt in der Queue ist, wird ein Slaveserver gestartet, an diesen du das Request-Objekt übergibst - z.B. über den Konstruktor.
    Das geht leider nicht, da MATLAB eine relativ lange Startphase hat, müssen die SlaveServer bereits gestartet sein, d.h. ich weiß zu jeder Zeit wieviele SlaveServer aktiv sind.

    Das wird ein Problem, wenn man deine Idee umsetzen will. (Wenn ich dich richtig verstanden haben!)
     

  7. #7
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Ok. Du kannst es ja auch so machen, dass die SlaveServer auf die Anfrage-Queue listen und sobald eine Anfrage vorhanden ist, nimmt derjenige SlaveServer der zu erst war sich diese Anfrage und bearbeitet diese. Dann müsste es auch funktionieren
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 19.10.10, 12:11
  2. MySql Master / Slave - Connections C#
    Von tecla im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 19.10.09, 11:46
  3. MySQL, Master-Slave-Replikation
    Von rtd1978 im Forum Linux & Unix
    Antworten: 0
    Letzter Beitrag: 25.04.08, 11:27
  4. Master/Slave -Startbildschrim?
    Von LostProphet im Forum Hardware
    Antworten: 2
    Letzter Beitrag: 08.01.05, 13:48
  5. Erklärung: Master / Slave, Primary Ma /Sl...
    Von Consti im Forum Hardware
    Antworten: 9
    Letzter Beitrag: 03.01.05, 19:00