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.