Poslao: 14 Jan 2005 23:35
|
offline
- meka
- 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
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
|
Poslao: 15 Jan 2005 10:56
|
offline
- meka
- 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.
|
|
|
|
Poslao: 15 Jan 2005 11:07
|
offline
- bobby
- Administrator
- 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
|
|
|
|
Poslao: 16 Jan 2005 16:47
|
offline
- 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!
|
|
|
|
Poslao: 17 Jan 2005 01:56
|
offline
- meka
- 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. Hvala jos jednom
|
|
|
|