NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Petr Kasnal
Člen
Avatar
Petr Kasnal:12.5.2017 14:07

Ahoj, mám takový dotaz :p Učím se vlákna a pochopil jsem, že pomocí metody yield si vlákna předávají řízení. Ale když chci vypsat například 100 čísel tk to nevypíše 11,22,33 atd. ale proházeně. Můžete mi prosím někdo vysvětlit proč tomu tak je ? Děkuji moc za odpovědi

 
Odpovědět
12.5.2017 14:07
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Petr Kasnal
gcx11:13.5.2017 0:34

Ahoj, díky preemptivnímu přepínání vláken (každých X ms se může vlákno přerušit, aby pokračovalo zase jiné), se může vlákno změnit i bez zavolání Yield. Navíc nemáš zaručeno, že se budou provádět v takovém pořadí, v jakém chceš. Pokud chceš vypisovat čísla postupně, tak musíš použít nějakou zesynchronizovanou datovou stukturu, kam dáš čísla a vlákna si je budou postupně brát a vypisovat.

Editováno 13.5.2017 0:34
 
Nahoru Odpovědět
13.5.2017 0:34
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Petr Kasnal
gcx11:13.5.2017 0:38

Anebo v tom máš chybu. Postneš sem kód?

 
Nahoru Odpovědět
13.5.2017 0:38
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na gcx11
Petr Kasnal:14.5.2017 11:11

Jo moc děkuju za vysvětlení :) Asi to bude tím ale radši sem ještě pošlu příklad :)
třída na vytvoření vlákna:

public class FirstThread extends Thread {

    public FirstThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for(int i = 0; i<50; i++) {
            System.out.println(getName()+": "+i);
            yield();
        }
    }
}

Třída s metodou main

public static void main(String[] args) {
        FirstThread f1 = new FirstThread("1. Vlákno");
        FirstThread f2 = new FirstThread("2. Vlákno");
        f1.start();
        f2.start();
    }
 
Nahoru Odpovědět
14.5.2017 11:11
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Petr Kasnal
gcx11:16.5.2017 3:03

Podle dokumentace:
public static void yield()

A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore this hint.

Přepnutí vláken není tak "levná" operace pro procesor, takže se občas vyplatí nechat vlákno dále běžet, jelikož přepínání vláken při každé příležitosti by ty programy akorát hrozně zpomalovalo.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
16.5.2017 3:03
Avatar
Petr Kasnal
Člen
Avatar
Odpovídá na gcx11
Petr Kasnal:16.5.2017 13:07

Moc ti děkuju :)

 
Nahoru Odpovědět
16.5.2017 13:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.