Co się dzieje z wątkami potomnymi, kiedy wątek rodzic się skończy?

Co się dzieje z wątkami potomnymi, kiedy wątek rodzic się skończy?
WY
  • Rejestracja:ponad 2 lata
  • Ostatnio:7 miesięcy
  • Postów:16
0

Załóżmy, że mam wątek A który uruchamia wątki B i C. Co się stanie z wątkami B i C gdy wątek a zakończy swoje działanie? Mam problem tutaj:

Kopiuj
public class Letters extends Thread implements Iterable<Thread>
{
    private String chars;

    private Thread[] threads;
    int index = 0;

    public Letters(String chars)
    {
        this.chars = chars;
        this.threads = new Thread[chars.length()];

        for (int i = 0; i < threads.length; i++)
        {
            int finalI = i;
            Thread thread = new Thread()
            {
                @Override
                public void run()
                {
                    while (!Letters.this.isInterrupted())
                    {
                        System.out.print(chars.charAt(finalI));
                        try
                        {
                            Thread.sleep((int) (Math.random() * 2000));
                        }
                        catch (InterruptedException e)
                        {
                            throw new RuntimeException(e);
                        }
                    }
                }
            };

            threads[finalI] = thread;
        }
    }

    @Override
    public void run()
    {
        for (Thread thread : threads)
        {
            thread.start();
        }

        while (true)
        {
            if (this.isInterrupted())
                return;
        }
    }

    Iterator<Thread> threadsIterator = new Iterator<Thread>()
    {
        @Override
        public boolean hasNext()
        {
            return index < threads.length;
        }

        @Override
        public Thread next()
        {
            return threads[index++];
        }
    };

    @Override
    public Iterator iterator()
    {
        return threadsIterator;
    }
}

i metoda main:

Kopiuj
public static void main(String[] args)
{
    Letters letters = new Letters("ABCD");


    for (Thread t : letters)
        System.out.println(t.getName() + " starting");

    letters.start();
    try
    {
        Thread.sleep(5000);
    }
    catch(InterruptedException ignore)
    {

    }
    letters.interrupt();
    System.out.println("\nProgram completed.");
}

Nie rozumiem do końca różnicy między isInterrupted() i interrupted():

Kopiuj
while (true)
{
    if (this.isInterrupted())
        return;
}

Gdy w warunku if użyję metody Thread.interrupted() to wtedy zostanie tylko zakończone wykonywanie metody run klasy letters ale już wątków uruchomionych przez tą metode nie. Jeśli użyję isInterrupted() to program kończy swoje działanie.

edytowany 3x, ostatnio: Riddle
GO
Manualne formatowanie jakby ktoś chciał: Array.from($$("body code")).forEach(e => e.setAttribute("class", "language-java")); Prism.highlightAll() lub url link javascript:(() => { Array.from(document.querySelectorAll("body code")).forEach(e => e.setAttribute("class", "language-java")); Prism.highlightAll() })():)
WY
dzieki właśnie tego potrzebowaliśmy
SU
  • Rejestracja:prawie 2 lata
  • Ostatnio:dzień
  • Postów:5
0

Jeżeli się nie mylę, to kwestia tego: interrupted to metoda statyczna, która po wywołaniu clearuje potencjalny status interrupta. Z Javadoca:

Tests whether the current thread has been interrupted. The interrupted status of the thread is cleared by this method. In other words, if this method were to be called twice in succession, the second call would return false (unless the current thread were interrupted again, after the first call had cleared its interrupted status and before the second call had examined it).

Z tego co widze to "literowe" wątki przerwą się wtedy i tylko wtedy kiedy wątek na którym jest obiekt Letters jest interrupted. Kiedy wołasz Thread.interrupted(), to jeśli thread będzie faktycznie interrupted, to ta metoda ustawi flagę isInterrupted na false. Wątek letters potem kończy się, ale nadal nie jest interrupted. Przez to te wątki pracują dalej.

WY
  • Rejestracja:ponad 2 lata
  • Ostatnio:7 miesięcy
  • Postów:16
0

Dzięki za odpowiedź @summazen. Co uważacie o rozdziale na temat programowania współbieżnego z Thinking in Java, ta książka jest do Javy 5. Może to być dobre wprowadzenie, aby ogarnąć podstawy, czy jednak po Javie 5 sporo się zmieniło i lepiej poszukać czegoś innego?

edytowany 1x, ostatnio: wydra__
SU
  • Rejestracja:prawie 2 lata
  • Ostatnio:dzień
  • Postów:5
1
wydra__ napisał(a):

Dzięki za odpowiedź @summazen. Co uważacie o rozdziale na temat programowania współbieżnego z Thinking in Java, ta książka jest do Javy 5. Może to być dobre wprowadzenie, aby ogarnąć podstawy, czy jednak po Javie 5 sporo się zmieniło i lepiej poszukać czegoś innego?

Jak chcesz zrozumieć współbiegi z wszelkimi niuansami to polecam Java concurrency in practice od Goetza, cokolwiek starszego niż java 8 to moim zdaniem dinozaury

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
2

Nie wiem na jakim poziomie jesteś ale:

  1. W Javie wszedł wreszcie project Loom (która Java, ktoś pamięta numer?) który zmienia trochę sytuację dla operacji czekających na dane. Zamiast czekać na dane w threadzie (watku), lepiej czekać w fiberze (włóknie)
  2. W pracy Java developera rzadko manipuluje się wątkami manualnie. No chyba że jesteś jednym z tych nielicznych co piszą biblioteki do manipularania wątkami jak Akka czy Cats-effects

Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
Zobacz pozostałe 2 komentarze
szatkus1
Zwykle to sią nazywało fiberami (thread - fiber, ładna analogia), ale Java wymyśliła, że nazwie to po swojemu, bo tak.
KamilAdam
Dobrze że nie "zielone wątki" XD to by rodziło niepokój że kiedyś wymyślą czerwone i niebieskie wątki XD
KamilAdam
potem by wyzywano javowców "zielonowątkowcy", heretycy jedni XD
szatkus1
To czerwonowątkowców należy się bać
W0
W pracy Java developera rzadko manipuluje się wątkami manualnie - niby tak, ale jednak dobrze wiedzieć czym są wątki i jak działają.
XY
  • Rejestracja:ponad 6 lat
  • Ostatnio:21 dni
  • Postów:257
0
summazen napisał(a):

Jak chcesz zrozumieć współbiegi z wszelkimi niuansami to polecam Java concurrency in practice od Goetza, cokolwiek starszego niż java 8 to moim zdaniem dinozaury

Czyli jesteś miłośnikiem dinozaurów? ;) Bo ta ksiązka jest z 2006 roku, a Java 8 z 2014 roku.

SU
faktycznie xD mimo wszystko zestarzała się lepiej niż większość książek z tamtego okresu
WY
  • Rejestracja:ponad 2 lata
  • Ostatnio:7 miesięcy
  • Postów:16
0

No ale z tego co zrobiłem mały research to i tak chyba nic lepszego niż ta książka od Goetza nie ma.

XY
  • Rejestracja:ponad 6 lat
  • Ostatnio:21 dni
  • Postów:257
2

Do wielowątkowości niskopoziomowej zapewne tak, ale powstało też trochę mechanizmów wysokopoziomowych w nowszych wersjach Javy i też trzeba je znać.

edytowany 1x, ostatnio: xy
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)