komunikacja między wątkami

0

Witam, mam pytanie. Jak komunikować się miedzy wątkami ?

Mam np. klasę:

class Watek implements Runnable {
	public function echo() {
		System.out.println("echo :-)");
	}
	
	@Override
	public void run() {
		while (true) {
			System.out.println("bach");
			Thread.sleep(1000);
		}
	}
}

Otrzymuje cały czas na ekran "bach" jak wiadomo.
Teraz chciałbym w tym wątku uruchomić metodę "echo" jak to wykonać ?

0
  1. To sie nie skompiluje...
  2. Nie rozumiem pytania. Wywołujesz ją tak samo jak wywołujesz println albo sleep bo to przecież też metody.
  3. To o co pytasz nie ma nic wspólnego z komunkacja między wątkami wiec WTF?
0

Niech zgadnę - po prostu wywołać ją w metodzie run ? public function echo() :D

0

Shalom, napisałem to na forum z rozpędu - rzuciłem tylko w notatniku taby.
Po kolei (main):

public class Teste {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        new Thread(new Watek()).start();
    }
    
}

Plik watek:

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

class Watek implements Runnable {
    public void echo() {
        System.out.println("echo :-)");
    }
 
    @Override
    public void run() {
        while (true) {
            System.out.println("bach");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

Po uruchomieniu main uruchomi się wątek a teraz z klasy MAIN a nie Watek chce uruchomic metodę "echo".

@miszasty93 ale zabawny jestes... :)

0

Szkoda słów.

    public static void main(String[] args) {
        Watek w = new Watek();
        new Thread(w).start();
        w.echo();
    }
0

Eh, faktycznie zlamiłem, że nie pomysłałem o tym.
@Shalom dzięki.

0

Chyba się trochę zapędziłem.
Załóżmy, że takich wątków chcę uruchomić 50. Z tym, że potrzebuje wysłać do nich jeszcze parametr mianowicie:

class Watek implements Runnable {
    private String cos;
    
    public void echo() {
        System.out.println(cos);
    }
    
    public Watek(String cos) {
        this.cos = cos;
    }
 
    @Override
    public void run() {
        while (true) {
            System.out.println("bach");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

Jak teraz powinna wyglądać klasa w której jest main ?
Próbowałem zrobić tablice o wielkości danej wielkości Runnable i Thread, ale to nie przynosi efektu.

0

jaki main() chopcze ?
http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

jak byk!

public class HelloRunnable implements Runnable {

    public void run() {
        System.out.println("Hello from a thread!");
    }

    public static void main(String args[]) {
        (new Thread(new HelloRunnable())).start();
    }

}

Możesz to (new Thread(new HelloRunnable())).start(); do jakiegoś obiektu przypisać Thread a = ...
i już masz, obiekt wątku.

Wytłumaczy mi ktoś dlaczego ludzie tak bardzo lubią sobie życie komplikować ?

P.S jakbyś się pytał w jaki magiczny sposób wrzucić tam stringa: abrakadabra czary mary:
http://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html

0

@niezdecydowany nie wiem co Ty wkleiłeś ani do czego nawiązałeś.

Swój problem rozwiązałem przy użyciu List.
Jakby ktoś kiedyś się z tym zmagał:

public class Teste {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        List<Watek> lista = new ArrayList<Watek>();
        lista.add(new Watek("cos tam"));
        new Thread(lista.get(0)).start();
        lista.get(0).echo();
    }
    
}

i watek:

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

class Watek implements Runnable {
    private String cos;
    
    public void echo() {
        System.out.println(cos);
    }
    
    public Watek(String cos) {
        this.cos = cos;
    }
 
    @Override
    public void run() {
        while (true) {
            System.out.println("bach");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Watek.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}
0

@Czarny Krawiec tablica / kolekcja jak najbardziej zadziała. Ale ja nie bardzo rozumiem co ty chcesz osiągnąć, ale coś mi mówi że zabierasz sie za to od d**y strony.

0

Myślę, że nie do końca od strony "d**y".
W mojej metodzie, dochodzi do pętli, która się nie kończy, a w tym czasie potrzebowałem wysłać do niej informację, o uruchomieniu innej metody.
Nie da się też ominąć pętli, która nie kończy swojego działania - nasłuchuje wiadomości od serwera (serwer nie wysyła odpowiedniego komunikatu, w którym trzeba coś wykonać). Chyba, że może znasz lepsze rozwiązania przy takim "projekcie" - chętnie rozważę i się doszkolę. :-)

PS. Nie programuje żadnych wirusów. ;)

0

Chodziło mi o to co chcesz finalnie osiągnąć. Bo bardzo często zdarza sie tu, że ktos próbuje robić cuda na kiju i pyta o jakieś karkołomne konstrukcje potrzebne, żeby zaimplementować coś co wymyślił, podczas gdy rozwiązanie jego wyjściowego problemu jest dużo łatwiejsze :)

Konstrukcja którą podałeś nie jest zła i często sie ją stosuje. Na przykład żeby pozamykać wątki (w run() masz wtedy warunek na jakims booleanie, a tegoż booleana zmieniasz za pomocą metody).

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