flertrådet programmering

Tags:    java

<< < 12 > >>
Jeg skal finde primtal i en flertrådet java application. Indtil videre har jeg fundet en løsning fra javabog.dk hvor forfatteren udregner primtal vha. en enkel java-application.

Hvad kan jeg gøre?

Mit mål er at skrive et flertrådet program som udregner primtal. Samtidigt med at programmet regner, skal det kunne kommunikere med Brugeren og give ham/hende mulighed for at afslutte programmet og udskrive de primtal, der er fundet indtil da.

Dette er den application jeg har implementeret som udregner primtal i en enkel application:


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

/**
*
* @author emiliebalslev
*/
public class PrimeNumber {

public static void main(String [] args){
int numberToBeLookedAt = 9;
int factor = 2;

while(numberToBeLookedAt % factor > 0) {
factor = factor+1;
}
{
if (factor < numberToBeLookedAt)
{
System.out.println(numberToBeLookedAt + "is NOT a prime number,");
System.out.println("because it has the factor"+factor);
}
else {
System.out.println(numberToBeLookedAt + "is a prime number");
}

}
}

}




14 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Og concurrency betyder samtidighed. Tråde scheduleres på samme niveau som processer så har du en multicore eller hyperthreaded maskine så vil du opnå en bedre udnyttelse af hardwaren og bedre performance. Vi kan så hurtigt blive enige om at implementeringen af tjekket kunne optimeres men jeg tror at det er underordnet. Det lyder meget som en skoleopgave i multithreaded programmering.



Hej Emilie.

Jeg tænker at du laver en klasse primeque.
Den klasse har en metode som tager imod long fra og long til.
Denne metode fylder en intern attribut med alle numrene fra 'fra' til 'til'.
Klassen har også en anden attribut som er tom fra start, og som under kørslen fyldes med de tal som meldes tilbage som værende primtil fra den tråd som nu har testet det.

Yderligere har klassen disse to public synchronized metoder: nextnumber og logprime(long prime).

1) din hoved klasse starter din kø klasse op som object og giver den fra og til som danner dens interne liste af numre.
2) din hoved klasse starter x antal arbejder tråde op, med kø klasse objectet som argument/arameter til deres contructor (eller hvordan du nu vil give hver tråd adgang til kø-objectet)
3) nu kører hver tråd afsted, trækker et nummer fra køen - tester om det er et primtal og melder tilbage til køen med tallet hvis det var et primtal - og så om igen - træk nyt osv. - indtil tråden lukkes ned.

Altså - din test klasse som skal køre som en tråd for hvert object kan implementere runnable eller på anden måde gøre sig klar til at blive en tråd.

Hjalp det lidt?



Det hjalp mig mere i den rigtigt retning, men vil du sende mig noget kode også da jeg er lidt under tidspres?



Jeg vil godt lige rette noget, jeg sagde før.
Om brugen af multiple tråde giver bedre performance er afhængig af, hvordan du designer koden.

Synkronisering er tungt, så hvis dine tråde tager alt for små opgaver via et synkroniseret kald, så spilder du mere tid end du henter ved at dele opgaven op.

Tænk på det som hvis du skal hente 500 kasser øl i Tyskland. Det tager lang tid med én bil, men hvis du har fire, så kan det gå hurtigt...medmindre de henter én kasse hver pr. tur. Hvis de til gengæld fylder bilen op for hver tur, så burde det gå hurtigere.

Hvis du skal teste de første 1.000.000 tal for, om de er primtal, så lad være med at lade hver tråd hente ét tal fra køen, teste det og så hente det næste. Hent 10.000 tal fra køen på én gang med ét synkroniseret kald. Test dem og hent så næste sæt tal, som skal testes. Det er meget bedre.

Så, det jeg mente var, hvis man gør det rigtigt, så giver multithreading bedre performance :-)

Derudover kan man undlade at bruge Javas indbyggede "synchronized" mekanisme. Jeg var til Martin Thompsons worksom om lock-free algorithms til GOTO konferencen, og det var sgu lidt af en øjenåbner. Her er en video, hvor han gennemgår noget af teorien: http://www.infoq.com/presentations/Lock-free-Algorithms



Og concurrency betyder samtidighed. Tråde scheduleres på samme niveau som processer så har du en multicore eller hyperthreaded maskine så vil du opnå en bedre udnyttelse af hardwaren og bedre performance. Vi kan så hurtigt blive enige om at implementeringen af tjekket kunne optimeres men jeg tror at det er underordnet. Det lyder meget som en skoleopgave i multithreaded programmering.


Ja det er en opgave til faget: introduction to concurrent and distributed programming.



<< < 12 > >>
t