Vlákna - synchronizace – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Vlákna - synchronizace – Java – Fórum – Programujte.comVlákna - synchronizace – Java – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
johny
~ Anonymní uživatel
78 příspěvků
25. 2. 2013   #1
-
0
-

Ahoj,

zkousel jsem si napsat metodu, ktera by mne spocitala za pomoci rekurze fib. cislo.

Akorat nejak nechapu jak synchronizovat vlakna, ktery maji provadet vypocet.

Byl bych rad za nejaky rady co delam spatne a co vubec neresim atd.

predem dekuji   

Prikladam zdrojac: 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package up4jparfibvlakna;

/**
 *
 * @author johny
 */
public class Pokus {

    public static int fib(int n) {
        if (n == 0) {
            return 0;
        }
        if (n == 1) {
            return 1;
        }

        return fib(n - 1) + fib(n - 2);
    }

    public static int parfib(int n, int k) throws InterruptedException {
        Thread[] threads = new Thread[k];

        for (int i = 0; i < k; i++) {
            threads[i] = new Thread(new FibThreed(n));
        }

        for (Thread t : threads) {
            t.start();
        }

        for (Thread t : threads) {
            t.join();
        }
        return FibThreed.getFibNumber();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws InterruptedException {
        System.out.println(parfib(44, 5));
    }

    public static class FibThreed implements Runnable {

        private int n;
        private static int fibNumber = 0;

        public FibThreed(int n) {
            this.n = n;
        }

        @Override
        public void run() {
            fibNumber = fib(n);
        }

        public int getN() {
            return n;
        }

        public static int getFibNumber() {
            return fibNumber;
        }
    }
}
Nahlásit jako SPAM
IP: 46.33.117.–
Reklama
Reklama
ingiraxo+15
Grafoman
25. 2. 2013   #2
-
+1
-
Zajímavé

proboha lidi, napřed si to zkuste vyhledat sami, tohle mi našlo jako první link v googlu

http://www.milosnemec.cz/clanek.php?id=204

k tomu se používá klíčový slovo "synchronized" a stručně řečeno je to zámek, kdy zamkneš určitej blok kódu, aby ve stejnej čas byl prováděn jen jednim vláknem

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
johny
~ Anonymní uživatel
78 příspěvků
25. 2. 2013   #3
-
0
-

#2 ingiraxo

To jsem si samozřejmě našel, ale nechápu jak můžu jeden výpočet provádět za pomoci k vláken?Jedině to jde tak, že se střídají... a mě nenapadá, (spíš asi nechápu) jak toho docílit?Když jsem se to snažil synchronizovat za pomoci synchronized, tak se mi výpočet provedl napr. 5x, když jsem zadal 5 vláken.   

Nahlásit jako SPAM
IP: 46.33.117.–
ingiraxo+15
Grafoman
25. 2. 2013   #4
-
0
-

otázkou je, proč by si jeden výpočet dělal přes několik vláken... vlákno můžeš použít třeba na výpočet 1. kroku výpočtu a na druhej použiješ druhý vlákno a až budou obě vlákna hotová (bude čekat jedno na druhý = synchronizace), tak máš výsledek

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
johny
~ Anonymní uživatel
78 příspěvků
25. 2. 2013   #5
-
0
-

#4 ingiraxo
No bylo to tak v zadání co by jsme si měli zkusit.Máme vypočítat n-té fib. č. ,ale k výpočtu máme použít až k vláken.Co ale bude u výpočtu fib. č. první krok 2.,3. atd. ? 

Nahlásit jako SPAM
IP: 46.33.117.–
ingiraxo+15
Grafoman
26. 2. 2013   #6
-
0
-

teď si to řekl sám. "vypočítat n-té fib. č.".. každej krok je to "n",.. takže první vlákno si vezme n=1, druhy hned n=2 a to, který skončí dřív, tak n=3 atd.

tady použiješ ten sychronized, páč ten výpočet muže dělat jen jedno vlákno a další musí pokračovat a jít na dalčí vypočet

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
johny
~ Anonymní uživatel
78 příspěvků
26. 2. 2013   #7
-
0
-

#6 ingiraxo
Takže jestli jsem to pochopil správě,tak v mainu si vytvořim vlákna pro zkoušku 2. 

	Thread vlakno1 = new FibThreed(n);
        vlakno1.start();
        Thread vlakno2 = new FibThreed(n);
        vlakno2.start();

a dále mám nějakou třídu public static class FibThreed extends Thread {..}, u které přepíšu metodu run() ,ve které volám metodu pro výpočet fib. č. .

synchronized private int fib(int n) {
            if (n == 0) {
                return 0;
            }
            if (n == 1) {
                return 1;
            }
            return fib(n - 1) + fib(n - 2);
        }

Ale teď mně každé vlákno ten výpočet provede samotné pokud se nemýlím?Teď jsem skončil na tom jak je sesynchronizovat aby provedli jeden a tentýž výpočet jakoby společně...

Nahlásit jako SPAM
IP: 46.33.117.–
zlz
~ Anonymní uživatel
634 příspěvků
26. 2. 2013   #8
-
0
-

Zrovna tam je to synchronized k ničemu.

Mám takový pocit, že si to představuješ tak, že napíšeš funkci a vlákna si nějak automaticky práci té funkce mezi sebe rozdělí, každé udělá část a výsledek se zase nějak spojí. Takhle to nefunguje, každé vlákno prostě něco dělá, ve tvém případě všechny dělají to samé od začátku až do konce. To rozložení úkolu na části a rozdělení mezi vlákna musíš naprogramovat.

Synchronizace pak spočívá ve sladění a spolupráci těch vláken. Jako aby několik vláken neměnilo nějakou hodnotu současně, nebo aby se nenačítala data, která se zrovna jinde mění a nejsou v konzistentním stavu, nebo aby vlákno závislé na výsledku jiného vlákna počkalo až ten výsledek bude k dispozici a případně mezitím dělalo něco jiného apod.

Vlastně už to ingiraxo napsal, ale připadá mi, že tu podstatu nechápeš.

Nahlásit jako SPAM
IP: 78.156.159.–
johny
~ Anonymní uživatel
78 příspěvků
27. 2. 2013   #9
-
0
-

#8 zlz
Jo měl jsem v tom zmatek, ale už to snad mám ujasněny.

Děkuji.  

Nahlásit jako SPAM
IP: 158.194.149.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 45 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý