[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