Jak v Javě udělat thread s návratovou hodnotou?

anonym

Jak v Javě udělat thread s návratovou hodnotou?
« kdy: 07. 07. 2018, 14:04:13 »
Mám metody A a B, obě vrací Integer. Já je budu chtít spustit paralelně v určitém momentě si vyzvednout jejich návratové hodnoty, takhle nejak bych si predstavoval pripad uziti:

Kód: [Vybrat]

Integer A() {...}
Integer B() {...}

int C() {
 
 Task<Integer> taskA = TaskFactory.run(A);
 Task<Integer> taskB = TaskFactory.run(B);


  return D( taskA.getResultOrWait(), taskB.getResultOrWait() );

}


V C# bych na to sel pres Coroutiny, ale v Javě?


Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #1 kdy: 07. 07. 2018, 14:18:51 »
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

A okolní třídy.

Pozor na to, ať neucpeš defaultní threadpool.

Typolog

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #2 kdy: 07. 07. 2018, 14:32:03 »
Přepiš to do Haskellu ;)

borekz

  • ****
  • 494
    • Zobrazit profil
    • E-mail
Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #3 kdy: 07. 07. 2018, 18:42:49 »
Co takto ?

public class MojeVlakno extends Thread {
  int vysledek;
  public void run() {
    vysledek = 1;
  }
  public static void main(String[] args) throws Exception {
    MojeVlakno vlakno = new MojeVlakno();
    vlakno.start();
    vlakno.join();
    System.out.println("vysledek:"+vlakno.vysledek);
  }
}

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #4 kdy: 07. 07. 2018, 18:57:23 »
Co takto ?

public class MojeVlakno extends Thread {
  int vysledek;
  public void run() {
    vysledek = 1;
  }
  public static void main(String[] args) throws Exception {
    MojeVlakno vlakno = new MojeVlakno();
    vlakno.start();
    vlakno.join();
    System.out.println("vysledek:"+vlakno.vysledek);
  }
}

Čitelnost nic moc a když takhle budeš mít toho kódu víc...


Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #5 kdy: 07. 07. 2018, 19:11:20 »
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

A okolní třídy.

Pozor na to, ať neucpeš defaultní threadpool.

Určitě jít touto cestou, např. přes java.util.concurrent.ExecutorCompletionService si pak můžete úlohy spustit a zase vyzvedávat, snadno měnit počet souběžně probíhajících úloh apod. Prostě je tam spousta věcí už naprogramovaných a hotových k pohodlnému použití. Udělat si to ručně má smysl jen pro sebevzdělání.

kraxna

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #6 kdy: 08. 07. 2018, 01:13:18 »
Co takto ?

public class MojeVlakno extends Thread {
  int vysledek;
  public void run() {
    vysledek = 1;
  }
  public static void main(String[] args) throws Exception {
    MojeVlakno vlakno = new MojeVlakno();
    vlakno.start();
    vlakno.join();
    System.out.println("vysledek:"+vlakno.vysledek);
  }
}

Za tenhle kod se fakt styd a vsichni ostatni by si ho meli vzit jako odstrasujici priklad. Jednak je to necitelne, jednak to treba vubec neresi, ze doslo k chybe a je to (velmi spatne) preimplementovani existujiciho.

Pro OP: Future, CompletableFuture, prip. Flow.Producer a souvisejici, pokud to potrebujes reaktivni.

anonym

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #7 kdy: 08. 07. 2018, 10:33:55 »
A jaký je rozdíl mezi Coroutinou a Feature? Mě se zdá, že to umí to samé. Nebo ne?

anonym

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #8 kdy: 08. 07. 2018, 10:34:57 »
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

A okolní třídy.

Pozor na to, ať neucpeš defaultní threadpool.

Tzn. já si z něj můžu vzít jen určitý počet vláken? Z toho mi ale hrozí deadlock, ne? Proč tam prostě není nekonečný počet vláken?

kraxna

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #9 kdy: 08. 07. 2018, 10:49:59 »
Tzn. já si z něj můžu vzít jen určitý počet vláken? Z toho mi ale hrozí deadlock, ne? Proč tam prostě není nekonečný počet vláken?

Protoze neni efektivni napr. na 2 jadru spustit 100 vlaken :-) Pokud ti hrozi deadlock, tak to mas spatne navrzene.
Myslenka future a dalsich je takova, ze se jedna o nezavisle vypocty, ktere postupne chceme ziskat - tzn. neco jako deadlock by tu vubec nemelo mit moznost nastat.

Samozrejme si muzes udelat i vlastni threadpool, ale stejne to zavani spatnym navrhem.

anonym

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #10 kdy: 08. 07. 2018, 11:09:10 »
Tzn. já si z něj můžu vzít jen určitý počet vláken? Z toho mi ale hrozí deadlock, ne? Proč tam prostě není nekonečný počet vláken?

Protoze neni efektivni napr. na 2 jadru spustit 100 vlaken :-) Pokud ti hrozi deadlock, tak to mas spatne navrzene.
Myslenka future a dalsich je takova, ze se jedna o nezavisle vypocty, ktere postupne chceme ziskat - tzn. neco jako deadlock by tu vubec nemelo mit moznost nastat.

Samozrejme si muzes udelat i vlastni threadpool, ale stejne to zavani spatnym navrhem.

Ale prd není efektivní, když voláš nějakou vzdálenou službu, nebo čekáš na výsledek dotazu v databázi, nebo něco stahuješ, tak je ti jedno, že máš 100 threadů a jen 2 jádra.

echt

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #11 kdy: 08. 07. 2018, 11:16:23 »
Tzn. já si z něj můžu vzít jen určitý počet vláken? Z toho mi ale hrozí deadlock, ne? Proč tam prostě není nekonečný počet vláken?

Protoze neni efektivni napr. na 2 jadru spustit 100 vlaken :-) Pokud ti hrozi deadlock, tak to mas spatne navrzene.
Myslenka future a dalsich je takova, ze se jedna o nezavisle vypocty, ktere postupne chceme ziskat - tzn. neco jako deadlock by tu vubec nemelo mit moznost nastat.

Samozrejme si muzes udelat i vlastni threadpool, ale stejne to zavani spatnym navrhem.

Ale prd není efektivní, když voláš nějakou vzdálenou službu, nebo čekáš na výsledek dotazu v databázi, nebo něco stahuješ, tak je ti jedno, že máš 100 threadů a jen 2 jádra.

Nie je pravda. Vlákna majú výkonostný dopad a výraznejší ako sa zdá. Jeden z dôvodov prečo sa prešlo na event orientované riešenia pri veľkej zátaži.

Každé vlákno musí byť spustené, aby zistilo, či môže pokračovať, a keď je ich 10, tak to je akceptovateľné, ale ak ich je 1000 a je tam slabé CPU, tak to výrazne spomaľuje beh.

kraxna

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #12 kdy: 08. 07. 2018, 11:23:03 »
Ale prd není efektivní, když voláš nějakou vzdálenou službu, nebo čekáš na výsledek dotazu v databázi, nebo něco stahuješ, tak je ti jedno, že máš 100 threadů a jen 2 jádra.

Neni to jedno, protoze kazde to jadro ma rezii na vytvoreni, zasobnik (a obecne TLS), scheduler, ale je pravda, ze se to pouziva aspon v nekterych pripadech (ale urcite to neni dobry napad pri 100 threadech). Kazdopadne u takoveho pripadu neni vubec vhodne pouzit default pool, ale vlastni. Smyslem default poolu je prave byt prizpusobeny efektivnejsimu zpracovani paralelnich (vypocetnich) uloh na danem HW.

Ale stejne nevidim moc zadny duvod proc treba pro provolani vzdalene sluzby nepouzit radeji asynchronni / event driven API. U JDK 9+ je na to HttpClient, pouzit ho umi napr. Spring WebClient.
U databaze (pokud to neni nejaka NoSQL) to samozrejme nejde, protoze JDBC a sprava transakci, ale tam zase tezko bude hrozit 100 vlaken a nebo je to velmi mizerny design, pokud by jeden request udelal tolik spojeni do DB :-)

anonym

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #13 kdy: 08. 07. 2018, 11:23:46 »
Tzn. já si z něj můžu vzít jen určitý počet vláken? Z toho mi ale hrozí deadlock, ne? Proč tam prostě není nekonečný počet vláken?

Protoze neni efektivni napr. na 2 jadru spustit 100 vlaken :-) Pokud ti hrozi deadlock, tak to mas spatne navrzene.
Myslenka future a dalsich je takova, ze se jedna o nezavisle vypocty, ktere postupne chceme ziskat - tzn. neco jako deadlock by tu vubec nemelo mit moznost nastat.

Samozrejme si muzes udelat i vlastni threadpool, ale stejne to zavani spatnym navrhem.

Ale prd není efektivní, když voláš nějakou vzdálenou službu, nebo čekáš na výsledek dotazu v databázi, nebo něco stahuješ, tak je ti jedno, že máš 100 threadů a jen 2 jádra.

Nie je pravda. Vlákna majú výkonostný dopad a výraznejší ako sa zdá. Jeden z dôvodov prečo sa prešlo na event orientované riešenia pri veľkej zátaži.

Každé vlákno musí byť spustené, aby zistilo, či môže pokračovať, a keď je ich 10, tak to je akceptovateľné, ale ak ich je 1000 a je tam slabé CPU, tak to výrazne spomaľuje beh.

Je pravda.

Když máš webovou službu, tak tam může v 1 okamžik klidně být 1000 requestů naráz, tzn. 1000 threadů naráz. Tak nějak si to musí ten systém pošéfovat. Hoši, běžte si počítat ty vaše Fibonaciho posloupnosti jinam, tady se řeší Java a pořádné systémy  8)

JSH

Re:Jak v Javě udělat thread s návratovou hodnotou?
« Odpověď #14 kdy: 08. 07. 2018, 11:41:32 »
Je pravda.

Když máš webovou službu, tak tam může v 1 okamžik klidně být 1000 requestů naráz, tzn. 1000 threadů naráz. Tak nějak si to musí ten systém pošéfovat. Hoši, běžte si počítat ty vaše Fibonaciho posloupnosti jinam, tady se řeší Java a pořádné systémy  8)
Jestli trollíš a snažíš se hrát prasiče, tak ti to celkem jde.

Jak je třeba obsluhovat spoustu požadavků zároveň tak je dost blbé spouštět hromady vláken. Pro čekání na IO nepotřebuju hromady alokované paměti pro zásobník a další blbiny. Každý relativně moderní OS a jen trochu příčetný framework (včetně Javy) podporují asynchronní IO.

Z těch 1000 requestů v každém okamžiku většina čeká (na disk, síť, ...). Na to nepotřebuje vlákno.