Avatar billede jespersahner Nybegynder
22. januar 2006 - 22:32 Der er 8 kommentarer og
1 løsning

Hovedprogram med flere parallelle tråde

Dette er nok et enkelt spm. Jeg har et program, hvor en række opgaver pt. afvikles sekventielt. For at speede det op vil jeg lade programmet afvikle opgaverne i separate tråde, men selve hovedprogrammet skal først fortsætte, når samtlige tråde er færdige.

Hvordan designer man dette på den rigtige måde?
______________

Jeg tænker således (har dog ingen erfaring omkring dette):

1. Hovedprogrammet holder styr på antallet af startede tråde (total). Når en tråd er færdig, opskriver den en tæller i hovedprogrammet (antal). Hovedprogrammet indeholder en do-løkke:
do {
} while (antal<total);
Hovedprogrammet vil derfor køre rundt i denne løkke, indtil alle tråde er færdige og derefter fortsætte.

2. Delen af hovedprogrammet, der skal fortsætte, når alle tråde er færdige, er selv en tråd. Hver opgave-tråd opskriver antal og starter derefter hovedprogrammets tråd, når antal==total.

Jeg er lidt usikker på om metoden i 1. vil drosle afviklingen ned, idet hovedprogrammet bruger unødig tid på at køre rundt i en løkke.
Avatar billede simonvalter Praktikant
23. januar 2006 - 00:13 #1
Avatar billede jespersahner Nybegynder
23. januar 2006 - 00:56 #2
->simonvalter: Hvordan mener du?
Avatar billede simonvalter Praktikant
23. januar 2006 - 01:23 #3
Thread t1 = new Thread(runnable1);
Thread t2 = new Thread(runnable2);
t1.start() ; t2.start();

t1.join() ; t2.join();
// dette punkt nåes kun efter t1 og t2 er termineret
Avatar billede jespersahner Nybegynder
23. januar 2006 - 02:05 #4
->simonvalter: Lyder ædrueligt, tak for dit input. Smid gerne et svar.
Avatar billede schwarz84 Nybegynder
23. januar 2006 - 08:58 #5
jespersahner: Nu skriver du ikke hvor mange threads, det er, men en bedre løsning vil nok være at bruge en threadpool. Fyld de threads i, du vil have udført, kald shutdown() og vent på !isShutDown() med en while-løkke. Når denne løkke returnerer true, er alle tråde udført, og du kan fortsætte. Det gælder selvfølgelig kun trådene i poolen, så du kan fortsætte med de andre tråde...

Hvis du vil gøre det på 1. måde, du skriver, kan du indsætte Thread.sleep(int tid) i løkken. Så udføres den med tid millisekunders mellemrum i stedet for hele tiden...
Avatar billede schwarz84 Nybegynder
23. januar 2006 - 09:00 #6
Du kan finde factory methods som laver den ønskede thread pool i klassen Executors. Den, du skal bruge, er nok newFixedThreadPool.
Avatar billede simonvalter Praktikant
23. januar 2006 - 10:14 #7
svar
Avatar billede arne_v Ekspert
23. januar 2006 - 15:26 #8
der er en nopgle eksempler i http://www.eksperten.dk/artikler/27
Avatar billede jespersahner Nybegynder
23. januar 2006 - 15:48 #9
Tak for de mange input!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester