Java i monitori

Java i monitori

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Imam za zadatak da odradim multithreaded applet. Nije uopste problem osmisliti ga ali kako se radi sa monitorima mi nije jasno. Znam da postoji synchronized metoda ali sta da radim sa tim kada napravim klasu? Znam kada je thread u pitanju da postoji run() i start(). Sta sa ovim? Da li bi mogao neko da mi da primer kako monitorima napraviti da dva thread-a makar ispisuju nesto (jedan karakter 'a' a drugi 'b' npr.)? Stvarno mi je frka imam u ponedeljak ujutru zadnji rok za predaju. Hvala vam puno Smile



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

probaj prvo ovo odavde:
http://www.cs.clemson.edu/~cs428/resources/java/tutorial/JTThreadEx.html
pa onda ovo:
http://www.wilsonmar.com/1threads.htm

a mislim da ti je najbolje ovo:
http://www.ase.md/~aursu/JavaThreads.html

Ukoliko nista ne pomogne, javi pa da ti otkucam ovde jedan primer (sto mi je u ovom trenutku jako mrsko jer je 4:45 ujutru)



offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Pa u sustini, taj deo je onaj koji znam. ja se snalazim sa threadovima. Problem je u tome sto znam kako napraviti monitorske metode i volatile .... ma to je sve ok. Jedino kada napravim da je nesto synchronized koliko sam ja skontao ne moram da nasledjujem Runnable (barem nisam video da asistent nista slicno radi), pa ne znam kako da pokrenem paralelno kada nemam start() i run(). Hvala za odgovor, nadam se samo da sada nije 5 ujutru. Smile

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Gledam upravo Schildtovu knjigu, kaze da su Threadovi u Javi po dizajnu asinhroni. Jedino sto po meni lici na sinhronizaciju je onad primer sa zadnjeg linka:
 //Example 9. class Thready {     public static void main( String args [] ) {         new MyThread("A").start();         new MyThread("B").start();     } }   class MyThread extends Thread {     String message;       MyThread ( String message ) {         this.message = message;     }       public void run() {         while ( true ) {              System.out.print( message );             yield(); }     } }
koji daje
ABABABABABAB


EDIT:
da ispravim svoju lenjost, nasao sam jedan primer koji ce ti mozda odgovarati (ipak cu morati da prekucam iz knjige):
//Ovaj program nije sinhronizovan class PozoviMe [     void poziv(String poruka) {        System.out.print("[" + poruka);        try {           Thread.sleep(1000);        } catch(InterupptedException e) {           System.out.println("Prekinuto");        }        System.out.println("]");     } } class Pozivanje implements Runnable {   String poruka;   PozoviMe cilj;   Thread t;   public Pozivanje(PozoviMe ciljni, String s) {      cilj = ciljni;      poruke = s;      t = new Thread(this);      t.start();    }       public void run() {      cilj.poziv(poruka);    }   }  class Sinhro {    public static void main (String args[]) {      PozoviMe cilj = new PozoviMe();      Pozivanje ob1 = new Pozivanje (cilj, "Zdravo");      Pozivanje ob2 = new Pozivanje (cilj, "Sinhronizovani");      Pozivanje ob3 = new Pozivanje (cilj, "Svete");      //cekanje da se niti zavrse      try {        ob1.t.join();        ob2.t.join();        ob3.t.join();        }        catch(InterruptedException e) {         System.out.println("Prekinuto");        }      } }

Da bi sinhronizovao niti, potrebno je da izmenis sledece u prethodnom primeru:

  class PozoviMe {    synchronized void poziv(String poruka)  { ....

ili promeniti metodu run() da izgleda kao:
public void run() {   synchronized(cilj) {   // sada idu naredbe koje se sinhronizuju    cilj.poziv(poruka);   } }


Nadam se da je pomoglo

offline
  • real 
  • Elitni građanin
  • Pridružio: 25 Nov 2004
  • Poruke: 2297
  • Gde živiš: Kragujevac

Iskreno da ti kazem, malo sam te razumeo. Evo, danas je nedelja popodne, tek sad sam video ovaj post, pa cu probati da ti pomognem. Nadam se da necu promasiti temu. Dajem ti prost primer kako bi dva Thread-a mogla medjusobno da uticu na neku promenljivu u apletu.
Napomena 1: da bi npr. tvoj aplet naizmenicno ispisivao ABABABABAB (jedan thread da ispisuje "A" a drugi "B") ne treba ti multithreaded applet vec obican loop.
Al' evo kako i to moze, mada naravno nece biti naizmenicno. Ispis na konzoli dobijas kad kliknes misem na applet.

import java.awt.*; import java.lang.*; import java.applet.Applet; public class MyApplet extends Applet {   Thread t1, t2;   boolean running = false;   StringBuffer stbf = ""; public void init() {   resize(300,300);   stbf = new StringBuffer();   t1 = new TestThread1(this);   t1.start();   t2 = new TestThread2(this);   t2.start();   running = true; } // kad nit stane, klik na applet ce isprazniti buffer i nastaviti proces // sa niti koja je poslednja bila aktivna public boolean mouseDown(Event ev, int x1, int x2) {   System.out.println("");   stbf = new StringBuffer();   notify();   return true; } public void destroy() {   t1.stop();   t2.stop(); try {   t1.join();   t2.join(); } catch (InterruptedException e) { } } } //synchronized se ovde nalazi da bi se naizmenicno dodavala slova A i B //posto postoje samo dve niti public void dodajSlovo(String slovo) {   synchronized (this) {     if (stbf.length() = 100) zaustaviNit();     stbf.append(slovo);   }   System.out.println(stbf.toString()); } public void zaustaviNit() {   try {     wait();   } catch (InterruptedException e) { } } class TestThread1 extends Thread { Applet a; public LineThread(Applet a) {   this.a = a; } public void run() {   //double width = (double) a.size().width;   //double height = (double)a.size().height;   while (true) {   Graphics g = a.getGraphics();   // ---------  Ovde radi sta hoces sa apletom "a".   // ---------  Ispisuj po njemu sta ti je volja   a.dodajSlovo("A");   try {     sleep(100);   } catch (InterruptedException e) { } } } class TestThread2 extends Thread { Applet a; public LineThread(Applet a) {   this.a = a; } public void run() {   //double width = (double) a.size().width;   //double height = (double)a.size().height;   while (true) {   Graphics g = a.getGraphics();   // ---------  Ovde radi sta hoces sa apletom "a".   // ---------  Ispisuj po njemu sta ti je volja   a.dodajSlovo("B");   try {     sleep(100);   } catch (InterruptedException e) { } } } }

Nisam startovao applet, al' dovoljno je prost tako da se nadam da ce odmah da radi ako nisam napravio neku gresku u kucanju. Srecno!

offline
  • meka  Male
  • Počasni građanin
  • Pridružio: 06 Avg 2003
  • Poruke: 811
  • Gde živiš: Novi Sad / Vojvodina

Glavni problem je bio u tome sto ja nisam cuo asistenta da je rekao da treba da nasledimo Thread (sto ne znaci da on to nije ni rekao). Izvinjavam se zbog svoje brljavstine. Hvala vam puno narode, ali moj applet, iz meni neznanih razloga nece da radi. Ipak, da nisam procitao neke stvari ovde moj applet ne bi ni postojao. Smile Hvala jos jednom

Ko je trenutno na forumu
 

Ukupno su 1197 korisnika na forumu :: 31 registrovanih, 5 sakrivenih i 1161 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., babaroga, Ben Roj, bladesu, bojank, bojankrstc, bojcistv, cavatina, dankisha, Denaya, Doca, Dorcolac, DPera, GAGI, M1los, mercedesamg, MiG-29M2, Miki01, milenko crazy north, MrNo, nenad81, Primus17, procesor, repac, Srle993, tmanda323, vathra, vladulns, voja64, wolverined4, yuklll