Klasa Thread oraz metoda wait

0

Witam,

chciałem napisac program, ktory tworzy dwa wątki. W obydwu mam zapisaną informację do drugiego. Program w założeniu miał działac w taki sposób, że po odpaleniu wątku nr 1 miał on na ekranie wypisać tekst 'AAAAAA' i przełączyć się na drugi wątek. Wątek numer dwa miał wypisać 'BBBBBBBBB' i przełączyć się na wątek nr 1. Wynik miał wyjść:

AAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBB:
AAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBB:
AAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBB:
AAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBB:
AAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBB
(.......)

Chciałem to wykonać za pomocą instrukcji wait oraz notifyAll. Jednak program się zawiesza zawsze w tym samym miejscu i nie wiem dlaczego. Bede wdzięczny za pomoc.

Oto kod mojej klasy:

import java.util.logging.Level;
import java.util.logging.Logger;

public class Corutine extends Thread {
        public Corutine(String nap){
            next = null;
            chodzi = false;
            this.setName(nap);
        }
        
        void setAttach (Corutine x){
            next = x;
        }
        
        public void run() {
            while(true){
                System.out.println("RUN -> "+this.getName());
                chodzi = true;
                attach();
            }
        }
        
        public boolean czy_chodzi()
        {
            return chodzi;
        }
        
        synchronized private void attach()
        {
            if( next!=null && !next.czy_chodzi() ){
                System.out.println("START ->" + next.getName());
                next.run();
            }
                
            this.notifyAll();
            System.out.println("WAIT ->" + this.getName());
                
            try {
                this.wait();
            } catch (InterruptedException ex) {
                Logger.getLogger(Corutine.class.getName()).log(Level.SEVERE, null, ex);
            }
            
        }
        
        private Corutine next;
        private boolean chodzi;
}

To kod Main:


import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Corutine cor1 = new Corutine("AAAAAA");
        Corutine cor2 = new Corutine("BBBBBB");
        cor1.setAttach(cor2);
        cor2.setAttach(cor1);
        cor1.run();
    }

}

Wynik to:

RUN -> AAAAAA
START ->BBBBBB
RUN -> BBBBBB
WAIT ->BBBBBB

Na tym WAIT się wiesza. Bedę wdzięczny za pomoc.

0

Poczytaj troche o watkach, jak sie je startuje (nie metoda run()) itp. Tutaj masz przyklad jak to mozna napisac:

package test;

public class Test {

    public static void main(String[] args) throws Exception {
        Object mutex = new Object();
        Thread a = new Thread(new MyRunnable(mutex, "AAA"));
        Thread b = new Thread(new MyRunnable(mutex, "BBB"));
        a.start();
        b.start();
    }

}

class MyRunnable implements Runnable {

    private Object mutex;

    private String s;

    public MyRunnable(Object mutex, String s) {
        this.mutex = mutex;
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (mutex) {
                System.out.println(s);
                mutex.notifyAll();
                try {
                    mutex.wait();
                } catch (InterruptedException exc) {
                    // TODO Auto-generated catch block
                    exc.printStackTrace();
                }
            }
        }
    }
}
0

Nom, wszystko się zgadza. Problem polega na tym, ze jest to moje zadano domowe. I chodzi w nim o to, żeby za pomocą funkcji attach przełączać się miedzy wątkami. Wywołanie funkcji attach powinno zawiesić wątek, w którym została ona wywołana, uaktywnić wątek zapisany w next. W next tez jest attach i w ten sposób wątki, mają sie przełączać między sobą. Czy jest to wykonalne? Chodzi mi o wykonanie tak zdefiniowanego programu bez synchronizacji na obiekcie?

0 użytkowników online, w tym zalogowanych: 0, gości: 0