packman schreef op 20 januari 2004 @ 15:24:
Je hele logic synchronized maken in een thread doet men normaalgezien toch niet vind ik. Dit is om problemen vragen vind ik. Wat je normaalgezien doet is de delen die echt synchronized moeten gebeuren (wijzigen/access van shared variabelen o.a.) in een eigen synchronized method steken, maar toch niet je hele logic binnen een thread?
Mijn hele logic is niet synchronized, alleen de access tot mijn (shared) dataruimte. Verder runt de hele logic wel in een thread, maar nog zonder synchronisatie.
Verwijderd schreef op 20 januari 2004 @ 15:30:
[...]
Volgens mij is een deel van je probleem (maar daar ben ik niet scheduleguru genoeg voor om dat echt te bepalen), dat je iig al 2 schedulers onder jou eigen scheduler hebt (die van je OS (is ook al preemtive) en die van je VM (ook preemtive). Daar bovenop wil je ook nog je eigen scheduler gebruiken. Dan kun je volgens mij niet gebruik maken van de schedule technieken die de Thread objecten binnen Java aanbiedt [oa. priority] (want die heeft dus al een eigen scheduler in dienst

). Ookal heb je een realtime OS. Java staat daarboven. Java biedt iets aan je CPU aan en die zal het (afhankelijk van je OS) zelf weer gaan schedulen, als Java dan weer iets anders in scheduled zal ie dat weer aan je OS aanbieden die het dan vervolgens ook weer scheduled enz, enz.
Ja, daar ben ik ook al achter. Net mijn testprogrammaatje dat priorities test en wisselt getest op een RTOS, en die doet het goed... alleen verkeerd om, de thread met de laagste prio runt steeds

Je moet dus zelf echt bepalen of een thread moet stoppen en door mag. Waarom je perse een thread zonder while wilt gebruik weet ik niet (nou waarom?

). Aangezien de enige twee echte operaties deprecated zijn (weet niet of ze deprecated zijn in de zin van: "over 2 versies bestaan ze nie meer want het is brakke code" of "we maken ze maar deprecated om aan te geven dat die functies gevaarlijk zijn voor prutsende programmeurs").
Die thread is een control flow, iets dat sequenteel uitgevoerd moet worden, niet iets dat herhaaldelijk moet gebeuren. Ik stop het in een thread omdat het wel parallel met andere threads moet lopen, en ook eventueel gepreempt moet worden.
Meegenomen dat jij je eigen scheduler aan het schrijven bent en waarschijnlijk wel goed zorgt dat threads niet uitsterven, in een deadlock raken of voor altijd lekker blijven slapen, kun je, als het om reden nummer 2 depracted functies zijn, ze toch wel gebruiken (hoe je erachter komt wat de reden is, is nog maar de vraag).
Ik denk dat het om reden 2 is gebeurd, want ik krijg het gevoel dat Java dingen zelden tot nooit verwijdert, wegens backwards compatibility. Hoe dan ook kan ik eisen voor mijn implementatie (is voor mijn afstudeeropdracht) dat het alleen in JVM 1.4 mag draaien.
Neem aan dat een andere progtaal (C, C++) niet tot de opties behoren? Realtime Linux in combinatie met de aangepaste POSIX threads die RTLinux biedt, zou de uitkomst zijn voor jou probleem.
Mijn werk is gebaseerd op een implementatie in Java. Daar komt bij dat ik een heel stuk bekender ben met Java dan met C(++). Maar als het echt niet anders kan bestaat er ook nog altijd de mogelijkheid die JNI me biedt. Alleen gezien mijn kennis van JNI en C(++) is dat niet echt aan te bevelen...
Maar nog 1 essentieel vraagje? Waarom ben je die scheduler aan het schrijven, Java en het OS doen toch ook al een goede zaak? Of staat de app los van het uitvoeren van systeemtaken?
De Java scheduler is geen optie, die maakt alleen gebruik van priorities, en niet eens 100% correct (starvation tegen gaan). Blijft over de scheduler van het OS, maar 1) ik wil het zo platform onafhankelijk maken, en 2) ik ben niet bekend met JNI, dus ik weet niet goed hoe ik het OS moet aanspreken. Zoals al gezegd een laatste redmiddel.
Veel succes
Dank je
Ik ga dan denk ik voorlopig eerst maar met suspend en resume proberen, en anders de moeilijke manier...
* Robtimus ziet nu pas dat de titel verkeerd is, had moeten zijn niet-lOOpende... ach ja