Avatar billede jespersahner Nybegynder
01. marts 2006 - 13:28 Der er 8 kommentarer og
1 løsning

Afvikle sekvens af metode-kald, der venter på hinanden

Jeg benytter flg. kode-stump (i en grafisk applikation):

MyClass myclass=new MyClass();
...
myclass.addMyClassListener(
  new MyClassListener() {
    public void completed(MyClassEvent e) {
      // færdig med at loade page
    }
...
// Hovedprogram   
myclass.loadPage("http://www.minside.com");


Programmet virker så på den måde, at loadPage() kaldes og load'er en webside. Når denne side er load'et, kaldes completed().

Jeg ønsker nu at anvende MyClass til at load'e en sekvens af websider, hvor jeg forestiller mig, at mit hovedprogram kunne have flg. struktur:

myclass.loadPage("http://www.minside1.com");
// vente til webside er load'et, hvordan?
myclass.loadPage("http://www.minside2.com");
// vente til webside er load'et, hvordan?
myclass.loadPage("http://www.minside3.com");
...

Jeg har altså brug for at afvikle en sekvens af metodekald, der venter på hinanden. Hvordan strikker jeg et sådant design sammen evt. ved brug af tråde?
Avatar billede arne_v Ekspert
01. marts 2006 - 14:11 #1
semaphor maaske ?
Avatar billede jespersahner Nybegynder
01. marts 2006 - 14:18 #2
->arne_v: Det må du lige uddybe :-)
Avatar billede arne_v Ekspert
01. marts 2006 - 14:25 #3
Java 1.5 se java.util.concurrent.Semaphore

for aeldre jaba versioner har jeg noget liggende

teknikken er at en traad hapser semaphoren og en anden traad venter paa semaphoren
indtil den foerste traad frigiver  den
Avatar billede jespersahner Nybegynder
03. marts 2006 - 17:30 #4
->arne_v: Den nemme måde er at placere alle metode-kaldene i completed() og kombinere med en tæller, der udfører dem en efter en, idet completed() netop venter på "completion". Altså noget med:

int count=0;
if (count==0) myclass.loadPage("http://www.minside1.com");
else
if (count==1) myclass.loadPage("http://www.minside2.com");
else
if (count==2) myclass.loadPage("http://www.minside3.com");
else
...
count++;

Hovedprogrammet skal så lige starte med at fyre en event af, så completed() kaldes første gang, alternativt skal første kald være i hovedprogrammet. Koden kan gøres noget pænere men tankegangen er den samme.

Jeg vil dog se lidt på Semaphore; det lyder interessant. Smid gerne et svar.
Avatar billede arne_v Ekspert
03. marts 2006 - 17:49 #5
jeg tror at semaphore loesningen kan laves paenere
Avatar billede jespersahner Nybegynder
03. marts 2006 - 19:26 #6
->arne_v: Hvis du har noget liggende, må du gerne smide det ind. Om ikke andet læser jeg selv lidt videre på lektien :-) Skriver du i øvrigt fra udlandet?
Avatar billede arne_v Ekspert
03. marts 2006 - 19:41 #7
public class Semaphore {
    private boolean inuse;
    private int counter;

    public Semaphore() {
        inuse = false;
        counter = 0;
    }

    public synchronized void get() {
        counter++;
        while (inuse) {
            try {
                wait();
            } catch (InterruptedException e) {
                // ignore
            }
        }
        inuse = true;
        counter--;
    }

    public synchronized void release() {
        inuse = false;
        notify();
    }
    public synchronized boolean available() {
        return inuse;
    }
    public synchronized int waiting() {
        return counter;
    }
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        Semaphore sem = new Semaphore();
        MyThread[] t = new MyThread[10];
        for(int i = 0; i < t.length; i++) {
            t[i] = new MyThread(sem);
        }
        for(int i = 0; i < t.length; i++) {
            t[i].start();
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e1) {
            // ignore
        }
        System.out.println("Waiting=" + sem.waiting());
        for(int i = 0; i < t.length; i++) {
            try {
                t[i].join();
            } catch (InterruptedException e) {
                // ignore
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("Time=" + (end - start));
    }

}
class MyThread extends Thread {
    private Semaphore sem;
    public MyThread(Semaphore sem) {
        this.sem = sem;
    }
    public void run() {
        sem.get();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // ignore
        }
        sem.release();
    }
}
Avatar billede arne_v Ekspert
03. marts 2006 - 19:41 #8
der er som sagt en Semaphore klasse indbygget i 1.5
Avatar billede arne_v Ekspert
03. marts 2006 - 19:41 #9
jeps - jeg sidder i udlandet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester