Java kérdés

Fórumok

Helló,

egy kérdésem volna Javaval kapcsolatban. Egy töbszálu progit írok amiben egyik szál beolvas valamit egy fileból egy streambe, a másik szál meg kiolvassa azt innen és földolgozza az datokat. A kérdés az hogyha a beolvasó szálban kivétel keletkezik akkor azt hogy tudom továbbdobni a másik szálnak? (Ugyebár a run() miatt nem lehet a throws-al.)

Előre is köszi a segítséget.

Hozzászólások

Szerintem csak úgy, hogy csinálsz egy olvasó által időnként nézegetett ojjektum referenciát egy Throwable-re (valahova). Azt beállítod a dobott kivételre, az olvasóban meg megnézed, és ha van ott kivétel, akkor azt dobta az író fél.
Ez egy nem túl szép megoldás volna. Ahhoz, hogy szebbet mondjak kellene ismerni a pontos szituációt.
Az sem világos, hogy minek külön szálon olvasni a fájlból a streambe. És a stream micsoda? Egy FIFO memóriában, vagy mi?

Ez egy szteganográfiás progi. Az olvasó szál dekódolja a szteganográfiás adatokat. De ez az eljárás ugyebár képformátumonként külömbözik, ezért ezt arészt tulajdonképpen tekinhetjük drivernek is. A program többi része mnem tud semmit arról hogy milyen képből olvasunk ki az adatokat az csak a már dekódolt adatokat kapja vissza a steram másik felén. Azért kell a drivernek külön szálban futni a mert a visszakapott adatok egy része fájl egy része megyjegyzés egy része meg a "tartalomjegyzék" de erről pedig a driver nem tud semmit, ezt a fölsőbb rétegek választják szét.

Röviden ez a progi amit írok.

Igen FIFO szerűséget használok a driver egy input streamból olvassa illetve egy outputstreamba írja az adatokat, a fölsőbb rétegen pedig pipedstream-mekkel oldom meg hogy mondjuk az outputstreamból amibe a driver ír ki tudjam olvasni az adatokat.

Találtam egy megoldást, ha Callable-ként valósítom meg akkor tudok return értéket is visszaadni és kivételt is dobni.

Csak azt nem értem hogy hol tudom megnézni hogy dobott-e kivételt a szálban futó metódus?

Ha valaki tudja légyszi írja meg. Előre is köszi.

Guglival:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Future.html

Tehát: egy ExecutorService-nek a submit metódusával indítod el a száladat. Ez egy Future objektumot fog visszaadni, aminek a fenti oldalon látható metódusai vannak. Az isDone metódussal le tudod kérdezni, hogy mi a helyzet, fut-e még a szál. Ha nem, akkor lekérdezed a get-tel az értékét, ami az lesz, amit visszaadott a callable, vagy dob egy szép(?) exceptiont. Pontosan azt, amit benne dobott a te kódod. Ha nem kérdezed le isDone-nal, hogy fut-e, akkor ha történetesen fut, akkor blokkolódni fog a szál, amin a get-et hívod addig, amig be nem fejeződik a másik.

Kb így lehet használni a java.util.concurrent apit használva. bár még mindig nem világos, hogy miért kell ilyen cuccot két külön szálra rakni. Hacsak nem többmagos processzorra optimalizálsz, bár akkor is értelmesebb inkább két külön képre futtatni az elemzést 1Xre, mint egy elemzést két procira rakni. Mivel a FIFO miatt csomót fog szinkronizálni a két szál.

Lenne nekem is egy kerdesem.

Adott egy NetBeans alatt osszehozott GUI form, ami a main fuggvenyben elindul, de elotte deklaralva van mar. Van rajta tobbek kozott egy jMessageBox nevu textarea. Ha ennek a jMessageBox-nak a konstruktorban az initcomponents() utan megadom, hogy jMessageBox.append("valami szoveg"), akkor gond nelkul megy, de viszont


public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
mw=new MainWindow();
mw.setVisible(true);
mw.jMessageBox.append("Akarmi"); // < Itt semmi nem tortenik
}
}

Es ez a bajom, hogy innentol mintha teljesen suket volna, semmi sem tortenik. Ha masik osztalybol hivom meg MainWindow.mw.jMessageBox.append("valami")-vel, akkor meg NullPointerException-t ad. Tuti en vagyok a lamer, de nem ertem :(
---
Hey! Where'd my terminal go?

Szia!

Ennyiből elég nehéz kitalálni mi a baj.
Ami ilyenkor a trükk: a .-tal szétválasztott sort több külön sorba kell tördelni, akkor kiderül, hogy melyik változó inicializálatlan (azaz null). Azonkívül az sem világos, hogy ez a sor dobja, vagy a meghívott metódusból jön a nullptrexc. A stacktrace sokat segítene...
Vagy nem állítod be a változót, vagy másik szálon később, vagy akármi más. 1000 oka lehet.
Amúgy nem világos az sem, hogy az invokelater blokkba minek kellett betenni a cuccot (persze attól még lehet, hogy be kell). Mindenesetre a runnable-k úgy vannak kitalálva, hogy nem dobnak exceptiont, tehát illik benne mindent lekezelni (runtimeexceptiönöket) és logolni, mert egyébként ki tudja hova fog kiíródni ami történik.

Meg egy kerdes:
Adott egy JTabbedPane; ehhez kellene hozzaadni tabokat, a tabokba pl. egy JTextArea. Hogy tudok en egy hatterben levo tabnak a textarea-jara irni? chat programot szeretnek irni :)
---
Hey! Where'd my terminal go?

Az a baj, hogy:
pl. jon neked egy privat uzenet, es a nick-kel, aki kuldte megnyit egy tabot, de x szamu masik userre is megnyit egy tabot. Mindegyik tabon lesz egy JTextArea, de ezeknek a neve ugyanaz lesz minden tabon, mert nem tudom megcsinalni, hogy a valtozo neve a nick-tol fuggoen valtozzon. Vagy tudsz erre modszert? (Tudom, lamer vagyok...). En arra gondoltam, hogy csinalok egy dinamikusan valtozo string matrixot, es ebbe irogatom az uzeneteket, ami nem az eppen lathato tabra megy, es pl. megnyitom a tabot, ha nincs olyan tab, es a cime melle teszek egy csillagot. Amikor rakattint az adott tab-ra, es aktivalodik a ful, amelyre uzenet erkezett, akkor bevagna a string matrixbol az adott oszlopot :)
---
Hey! Where'd my terminal go?