Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

Java Thread Sync

Pagina: 1
Acties:

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21:08
Hallo,

Ik heb een klasse welke de Thread klasse extend, en berekeningen uitvoert om priemgetallen te berekenen. Deze werkt als een trein.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class calcClass extrends Thread {
public function start() {

while(docalculate == true) {
double nr = resultsReturn.getNr(); //pak het nieuwste nummer

//Doe je berekening met de gekregen nummer

//Is het priem? sla dan op
if(isPrime == true) 
resultsReturn.save(nr); //Niewste priemgetal opslaan
}
}
}


en een klasse welke de resultaten opslaat, en teruggeeft

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class resultsReturn;
private static double lastNr;
private static double[] primes;

public static synchronized double getNr() {
//Haal het nummer uit de private lastNr
return lastNr;
}

public static synchronized void save(double nr) {
//Nieuwste priem opslaan
primes.add(nr);
//Print nieuwste prime @ scherm
System.out.println(nr);
}
}


en in de main void maak ik de twee threads aan zo:

Java:
1
2
3
4
5
6
7
public static void main(String[] args) {
firstThread = new calcClass();
secondThread = new calcClass();

firstThread.start();
secondThread.start();
}


Dit werkt allemaal prima, maar nu krijg ik alle resulaten dubbel? Als ik een enkele thread hebt krijg ik de resultaten wel eenmalig.

Wat doe ik fout? Aangezien de functies van de resultsReturn class synchronized en of static zijn? Deze moeten dan toch goed staan, en maar eenmalig worden verwerkt?

Ik ben nog maar net begonnen in Java, dus mischien zit ik er ook wel naast :)

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


Verwijderd

Stel dat beiden direct na elkaar getNr aanroepen. Dan krijgen ze toch hetzelfde nummer, omdat er in tussentijd niets veranderd hoeft te zijn. Je moet zorgen dat subsequente calls naar getNr nooit hetzelfde nummer kunnen geven.

Verder:
calcClass en resultsReturn zijn natuurlijk waardeloze namen voor classes.
Priemgetallen zijn nooit double.
Waarom een double array? Gebruik gewoon een ArrayList<int> ofzo.
Die threads kun je juist weer wel mooi in een array stoppen, of ook een ArrayList. Uitbreidbaar.
Doe eens juist indenten en tussen [code=java] en [/code] zetten.

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21:08
Deze code is niet excact de code die ik heb, en dit had ik vanuit de losse pols hier getyped. De code=java functionaliteit wist ik niet dat die hier bestond.

Over die namen, mja dit was meer een hello world leerachtige applicatie, normaal zijn de namen wel beter :)

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 16:12

Robtimus

me Robtimus no like you

ZpAz schreef op zondag 03 augustus 2008 @ 00:38:
Deze code is niet excact de code die ik heb, en dit had ik vanuit de losse pols hier getyped.
Ik mag hopen van wel ja. Ik zie die "function" maar over het hoofd, maar ik adviseer je toch echt om niet start maar run te overriden. Het is nml de start method die de daadwerkelijke thread start, en daarin run() aanroept.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Marcj
  • Registratie: November 2000
  • Laatst online: 15:34
Waarom maak je eigenlijk een class aan met alleen maar static synchronized functies? Dit zou je echt als object kunnen zien, dus dan kun je overal dat static weg halen.

Sowieso is het hele algorithme die je nu bedacht hebt niet correct. Je hoogt namelijk het nummer pas op als het uitgerekend is, waardoor je meerdere threads op hetzelfde nummer kan laten rekenen. Je zou er van uit kunnen gaat dat wanneer een nummer opgehaald wordt uit jouw 'Result' object, dat deze berekend wordt en dan kun je in die functie zelf al de interne counter ophogen. Dan zou het wel kunnen werken.

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 21:08
IceManX schreef op zondag 03 augustus 2008 @ 14:56:
[...]

Ik mag hopen van wel ja. Ik zie die "function" maar over het hoofd, maar ik adviseer je toch echt om niet start maar run te overriden. Het is nml de start method die de daadwerkelijke thread start, en daarin run() aanroept.
Foutje van mij hier :) Ik override idd run.
Marcj schreef op zondag 03 augustus 2008 @ 15:11:
Waarom maak je eigenlijk een class aan met alleen maar static synchronized functies? Dit zou je echt als object kunnen zien, dus dan kun je overal dat static weg halen.

Sowieso is het hele algorithme die je nu bedacht hebt niet correct. Je hoogt namelijk het nummer pas op als het uitgerekend is, waardoor je meerdere threads op hetzelfde nummer kan laten rekenen. Je zou er van uit kunnen gaat dat wanneer een nummer opgehaald wordt uit jouw 'Result' object, dat deze berekend wordt en dan kun je in die functie zelf al de interne counter ophogen. Dan zou het wel kunnen werken.
Inderdaad, zo heb ik het nu ook gedaan, en het werkt prima. :)

Claude: "Domain patterns emerge from iteration, not generation." - Tweakers Time Machine Extension | Chrome : FF

Pagina: 1