komunikacja między wątkami

Odpowiedz Nowy wątek
2015-02-15 21:41
Czarny Krawiec
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ć ?

Pozostało 580 znaków

2015-02-15 21:54
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?

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-02-15 21:54
0

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

Pozostało 580 znaków

2015-02-15 22:16
Czarny Krawiec
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... :)

Pozostało 580 znaków

2015-02-15 22:23
0

Szkoda słów.

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

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-02-15 22:26
Czarny Krawiec
0

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

Pozostało 580 znaków

2015-02-15 22:38
Czarny Krawiec
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.

Pozostało 580 znaków

2015-02-15 22:43
0

jaki main() chopcze ?
http://docs.oracle.com/javase[...]al/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[...]java/javaOO/constructors.html


"Perhaps surprisingly, concurrent programming isn’t so much about threads or
locks, any more than civil engineering is about rivets and I-beams."
edytowany 2x, ostatnio: niezdecydowany, 2015-02-15 22:45
Wytłumaczy mi ktoś dlaczego ludzie odpowiadają nie czytając wątku? o_O - Shalom 2015-02-15 22:46
czytam ten wątek po raz piąty, i nie czaje o co tu chodzi, widzę że to są zbyt skomplikowane tematy, cóż. - niezdecydowany 2015-02-15 22:51

Pozostało 580 znaków

2015-02-15 22:45
Czarny Krawiec
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);
            }
        }
    }
}

Pozostało 580 znaków

2015-02-15 22:46
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 dupy strony.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2015-02-16 01:47
Czarny Krawiec
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. ;)

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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