NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 1 - Multithreading v Javě

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Zakk
Člen
Avatar
Zakk:28.10.2018 16:40

To s těma lambdama jsem asi uplně nepobral, ale kdybych chtěl vytvářet vlákna pomocí implementace Runnable, tak bych to udělal asi nějak takhle.

//
public class ObjektRunnable implements Runnable {
        String jmeno;

        public ObjektRunnable(String jmeno) {
                this.jmeno = jmeno;
        }

        @Override
        public void run() {
                System.out.println("Vlákno " + jmeno + " spuštěno");
                for (int i = 0; i < 4; ++i) {
                        System.out.println("Vlákno " + jmeno + ": " + i);
                        try {
                                Thread.sleep(500);
                        } catch (InterruptedException ex) {
                                System.out.println("Vlákno " + jmeno + " přerušeno");
                                return;
                        }
                }
                System.out.println("Vlákno " + jmeno + " ukončeno");

        }

}

=============================================

public class HlavniProgram {

        public static void main(String[] args) {
                ObjektRunnable spustitelnyObjekt1 = new ObjektRunnable("prvni");
                ObjektRunnable spustitelnyObjekt2 = new ObjektRunnable("druhe");
                Thread prvniVlakno = new Thread(spustitelnyObjekt1);
                Thread druheVlakno = new Thread(spustitelnyObjekt2);
                prvniVlakno.start();
                druheVlakno.start();

        }

}
 
Odpovědět
28.10.2018 16:40
Avatar
Adam Bucher
Člen
Avatar
Adam Bucher:12.10.2019 16:40

Metodu getName() bohužel v lambda výrazu uvnitř main() volat nelze.
pocitac770 navrhoval použít mojeVlakno.get­Name(), u toho případu ale zase Javě vadí, že proměnná mojeVlakno nemusela být inicializována.
Lze tedy nějakým způsobem volat metodu getName() třídy Thread uvnitř zdejšího tutoriálového lambda výrazu ve statické metodě main()?

 
Odpovědět
12.10.2019 16:40
Avatar
Petr Svoboda
Člen
Avatar
Odpovídá na Adam Bucher
Petr Svoboda:14.7.2022 22:00

Lze tedy nějakým způsobem volat metodu getName() třídy Thread uvnitř ...

Samozřejmě, že nelze. Že se itnetwork nestydí :-( Že je ve cvičeních plno chyb, už jsem jsi zvyknul. Ale prásknout neodzkoušený nesmyslný kód do kurzu, do konce do 1. lekce, to je nový level.

Když píšeš implementaci Runnable, tak nemáš přístup k metodám tříd, ve kterých bude Runnable případně použit jako argument.

 
Odpovědět
14.7.2022 22:00
Avatar
Jan Krupa
Člen
Avatar
Jan Krupa:24.8.2023 20:22

Jsou tu pěkně vysvětlené ty lambda výrazy, ale ten poslední kód skutečně nefunguje.

 
Odpovědět
24.8.2023 20:22
Avatar
Odpovídá na Adam Bucher
Yveta Kršková:10.8.2024 18:14

Ano, pokud máš metodu main ve stejné třídě takto:

/**
 * jednoduchý program ukazuje, jak se střídá práce dvou vláken ve smyčkách
 * @author lekce itnetwork Matěj Kripner
 */
public class PraceSVlakny_extenseThread extends Thread{

    /**
     * konstruktor přidělil parametr "String jmeno" extenzi vlákna
     * a sjednotil ho s parametrem třídy Thread
     * @param jmeno
     */
    public PraceSVlakny_extenseThread(String jmeno){
        super(jmeno);
    }

    @Override
    public void run(){
        System.out.println("Vlákno " + getName() + " spuštěno");
        for(int i = 0; i < 4; i++){
            System.out.println("Vlákno " + getName() + ": " + i);
            try{
                Thread.sleep(500);
            }catch(InterruptedException ex){
                System.out.println("Vlákno " + getName() + " přerušeno");
                return;
            }
        }
        System.out.println("Vlákno " + getName() + " ukončeno");
    }

    public static void main(String[] args) {

        System.out.println("Hlavní vlákno spuštěno");
        PraceSVlakny_extenseThread vlakno = new PraceSVlakny_extenseThread("Druhe");
        vlakno.start();
        for(int i = 0; i < 4; i++){
            System.out.println("Hlavní vlákno: " + i);
            try{
                Thread.sleep(750);
            }catch(InterruptedException ie){
                System.out.println("Hlavní vlákno přerušeno");
                return;
            }
        }
        System.out.println("Hlavní vlákno ukončeno");
    }
}

taky se do lambda výrazů teprve vžívám, vynechávají půlku logiky, ale když píšu program se spoustou switchů a můžu je převést na lambdu, tak je to fajnový urychlení.

Odpovědět
10.8.2024 18:14
:D :D :D
Avatar
simon strnad
Člen
Avatar
simon strnad:15.8.2024 14:13

Poslední kód je špatně.. Kde? Je na Vás aby jste si to řádně otestovali, před tím než to dáte do kurzů.. Ostuda

 
Odpovědět
15.8.2024 14:13
Avatar
Lukáš Raška:25.9.2024 8:25

Celkově dobře vysvětleno. Jen v posledním kódu je chyba. V lambda výrazu nelze přímo volat getName(). Když už, tak Thread.curren­tThread().get­Name()

 
Odpovědět
25.9.2024 8:25
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 7 zpráv z 17.