Avatar billede dennispc Nybegynder
20. marts 2003 - 20:37 Der er 11 kommentarer og
1 løsning

RMI server med tråde/Thread

Jeg har forsøgt at finde ud af om rmi vha. remote calls opretter en ny selvstændig tråd som så kan styres ved med syncronized metoder på serveren. Jeg har testet dette, men flere klienter får lov at tilgå samme metode på en gang selv om denne er synchronized ?? Skal jeg evt selv oprette nye tråde på serveren når der kommer et request over Rmi´en fra klienterne ?? - Hvis dette er løsningen vil jeg meget gerne have et par ide´er eller endnu bedre eksempler....
På forhånd tak
Dennis
Avatar billede arne_v Ekspert
20. marts 2003 - 20:40 #1
Et RMI kald opretter en ny tråd.
Avatar billede arne_v Ekspert
20. marts 2003 - 20:44 #2
Dit synkroniserings problem vil jeg tro skyldes at:

public synchronized void foobar {
  ...
}

svarer til:

public void foobar {
    synchronize (this) {
        ...
    }
}

d.v.s. at den synkroniserer på objektet ikke på klassen (alle instanser
af objektet).
Avatar billede arne_v Ekspert
20. marts 2003 - 20:45 #3
Enten skal du synchronize på klassen.

Eller så skal du synchronize på det objekter som instanserne
deler og som giver problemerne.
Avatar billede dennispc Nybegynder
20. marts 2003 - 20:46 #4
Det mener jeg bestemt også, men når jeg fx. tester denne metode på serveren:

public synchronized boolean antalValgt(int id, int antal) throws RemoteException, InterruptedException
    {
      System.out.println("goddag");
      this.wait(15000);
      System.out.println("Farvel....");
      return bookingkontroller.antalValgt(id, antal);
  }

-får jeg fx. 3 goddag efterfulgt af 3 farvel, hvor det burde være goddag,farvel,goddag, osv
når jeg kalder ind fra 3 klienter...
Hvad kan der være galt ??
Avatar billede arne_v Ekspert
20. marts 2003 - 20:50 #5
Det jeg forklarer.

Prøv med:

private static final Class mylock = klassenavn.class;  // <---- erstat med rigtigt
public boolean antalValgt(int id, int antal) throws RemoteException, InterruptedException
    {
    synchronized(mylock) {
      System.out.println("goddag");
      this.wait(15000);
      System.out.println("Farvel....");
      }
      return bookingkontroller.antalValgt(id, antal);
  }
Avatar billede dennispc Nybegynder
20. marts 2003 - 21:15 #6
det virker som en god ide´ men nu får jeg desværre kun "goddag" og så en exception : IlligalMonitorStateException med meddelsen at "current thread not owner" ???
Avatar billede arne_v Ekspert
20. marts 2003 - 21:18 #7
Prøv lige at erstat this.wait(150000) med Thread.sleep(150000) !
Avatar billede arne_v Ekspert
20. marts 2003 - 21:21 #8
15000 selvfølgelig.
Avatar billede dennispc Nybegynder
20. marts 2003 - 21:28 #9
du er jo bare super arne V ! Nu får jeg "goddag-farvel" lige efter planen !!!
Men hvis du kan/gider må du gerne forklare mig lidt mere om hvad vi ændrede ved at synshronisere på klassen...
Mange tak for hjælpen !!
Avatar billede arne_v Ekspert
20. marts 2003 - 21:33 #10
Så går vi tilbage til mit 20:44:14 indlæg.

synchronized på metoden svarer til at synchronize på instansen.

Hvis RMI serveren starter en tråd og laver en:
    klassenavn k = new klassenavn();
    k.antalValgt(id, antal);
for hver request, så synkroniserer hver tråd mod sit eget objekt
d.v.s. at de slet ikke synkroniserer mod hinanden.

Den konstruktion jeg foreslog betyder at de synkroniserer
mod et fælles object (som jeg af systematiske årsager vælger
at lade være klassen selv).
Avatar billede arne_v Ekspert
20. marts 2003 - 21:35 #11
Den sidste lille krølle med wait/sleep skylde at wait også er en
synkroniserings metode og der var en elelr anden konflikt.

Thread.sleep er en klassisk sleep funktion som ikke
bruger synkroniserings mekanismer.
Avatar billede dennispc Nybegynder
20. marts 2003 - 21:42 #12
Endnu engang mange tak for hjælpen...jeg havde overset detaljen med at rmi serveren lavede en ny tråd og dermed en ny instans af klassen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester