[Java lista] java program folyamatok

bognár attila attila at netalfa.hu
2007. Jún. 15., P, 23:15:44 CEST


> public class Adatbazis extends Thread {
>     public void run() {
>         while(true) {
>             System.out.println("Adatbázis...");
>            
>             /**
>              * Nincs a közelben elérhető adatbázis, de tesztelni 
> viszont kell?
>              */
>             fakeDb = true;
>            
>             if(fakeDb) {
>                 hallgato = new HallgatoObj();
>                 szerver.lehetsegesHallgatokZarolva = true;
ez hol lesz false és mi a célja? vagy csak a jövőre vonatkozóan van? 
valami szinkronizálás mindenesetre nem ártana

nem tudom, hogy fejlődik tovább az alkalmazás, de ez nem túlságosan 
objektum orientált.


>                 szerver.lehetsegesHallgatok.clear();
>                 /**
>                  * Egy fake gynagy hozzáadása
>                  */
>                 hallgato.beallitAdatok("1", "Nagy", "György", "", 
> "nnnnn", "", "061234356478", "gynagy", "0630485738495", 
> "nagygyorgy at freemail.hu <mailto:nagygyorgy at freemail.hu>", "t", "t", 
> "t", "t", "t", "t", "t", "t");
>                 szerver.lehetsegesHallgatok.addElement(hallgato);
>                
>                 /**
>                  * Egy fake szoba hozzáadása
>                  */
>                 szerver.lehetsegesSzobakZarolva = true;

lásd hallgatók.


>                 szerver.lehetsegesSzobak.clear();
>                     /**
>                      * Lehetséges szobák hozzáadása a szerverhez
>                      */
>                     szoba = new SzobaObj();
>                     szoba.beallitAdatok("1", "Próba tanfolyam", "Ez 
> egy próba tanfolyam bla bla...", "1");
>                     szerver.lehetsegesSzobak.addElement(szoba);
>                     szoba = null;
>                    
>                 } else {ugyanez, csak adatbázisból}

ez ugyebár le sem fordul...

>                 try {
>                     System.out.println("Adatbázis vége...");
>                     sleep(10000);
>                 } catch (InterruptedException ex) {
>                     ex.printStackTrace();
>                 }

azt tudod, hogy ide nem jön be? azaz elvileg a cpu/mag 100%-on fut


> public class ChatHandler extends Thread {
 >    static Vector handlers = new Vector( 10 );

ennek mi a szerepe? csak belepakolsz és kiveszel.
a ChatServer.objektumok is gondolom hasonló célt szolgál (bár jelenleg 
az sincs kihasználva, ha jól látom)

  
>     public ChatHandler(Socket socket, ChatServer _szerver) throws 
> IOException {
>        
>         dout = new DataOutputStream( socket.getOutputStream() );
>        
>         in = new BufferedReader(
>                 new InputStreamReader(socket.getInputStream()));
>         out = new PrintWriter(
>                 new OutputStreamWriter(socket.getOutputStream()));

itt azért illene karakterkódolást is megadni, különben jönnek a 
meglepetések (azaz már az elején fel kell készülni valamilyen módon, 
ebben a formában nagyon alattomos)
emellett nem biztos, hogy szerencsés dolog két helyről írkálni ugyanabba 
a folyamba.


>     public void run() {
>         String uzenet;
>         synchronized(handlers) {
>             handlers.addElement(this);
>         }

itt miért van szinkronizálás?


>         try {
>     
>         } catch(IOException ioe) {
>             /**
>              * Ha hiba van az azért történik, mert elvágta egy markoló 
> a hálózati kábelt. KHM!
>              */
>             System.out.println("Megszakadt a kapcsolata...");

egy stack trace azért nem ártana...


>         } finally {
>             try {
>                 /**
>                  * Rendes kilépés, vagy hiba esetén lezárjuk a 
> kapcsolatot...
>                  */
>                 System.out.println("Kapcsolat lezárása...");
>                 in.close();
>                 out.close();
>                 socket.close();
>                 szerver.objektumok.remove(this);

ez utóbbihoz nem biztos, hogy eljut, ránézésre fontos lenne: ezzel 
kellene kezdeni a finally-t: a szerver legyen tiszta, a többi magánügy 
(megint nem igazán objektum orientált)


>             } catch(IOException ioe) {
>             } finally {

na ez az, amit nagyon nem illik:lenyelni egy kivételt. emiatt abszolút 
nem tudsz arról,hogy a szerver.objektumok.remove(this) nem hajtódott 
végre - max következtethetsz rá

>                 synchronized(handlers) {
>                     handlers.removeElement(this);
>                 }

itt megint nem értem a szinkronizálást.
 
> public class ChatServer {
>     public ChatServer() {
>         new Ping(this).start();

ez micsoda?


>         new Adatbazis(this).start();
>         try {
>             /**
>              * Végtelen ciklusban figyel, és ha valaki kapcsolódik, 
> nyit egy új
>              * ChatHandler-t
>              */
>             serverSocket = new ServerSocket(port);
>             while(true) {
>                 socket = serverSocket.accept();
>                 ChatHandler handler = new ChatHandler(socket, this);
>                 handler.start();
>                 objektumok.addElement(handler);

itt is rossz a sorrend: először regisztrálnám, utána indítanám. ha 
rögtön kivétellel kezd, elképzelhető, hogy elszállt a handler, de te 
utána regisztrálod.

>             }
>         } catch(IOException ioe) {
>             ioe.printStackTrace();
>         } finally {

ilyen kellene feljebb is

ezeket nézd át, valamint minden run ilyen legyen:

public void run ()
{
    try
    {
       // ami most a tartalma
    }
    finally
    {
       System.err.println("run vege");
    }
}

így meggyőződhetesz arról, hogy melyik szál fut le, melyik nem. 
ezenkívül vegyél ki néhány sallangot (redukáld a kódot), talán 
áttekinthetőbb lesz, mikor mi történik.

hogy néz ki a kapcsolódó kliens? (a ChatHandlernél ha a két if közül 
egyik sem teljesül a bejövőre, akkor szép csendben kering magában)
kiírja a kapcsolat megszakadt vagy bezárása üziket?


attila



--------- következő rész ---------
Egy csatolt HTML állomány át lett konvertálva...
URL: http://javagrund.hu/pipermail/javalist/attachments/20070615/e00f3f08/attachment.html 


További információk a(z) Javalist levelezőlistáról