Hi, ich soll 30x die Sekunde eine Methode aufrufen, das soll ich in der run-Methode eines Threads realisieren, aber wie macht man sowas?
for(int i = 0; i < 30; i++) {
// Tue etwas
Thread.sleep(1000 / 30);
}
Also einen Thread kann ich erstellen, dass ist kein Problem. Aber warum pausieren?Nun, normalerweise fängt man damit an, dass man weiß, wie man einen Thread erstellt.
Am einfachsten mit einer Klasse, die Runable implementiert. Anschließend durch einen Thread ausgeführt wird.
Dann kann man schauen, wie ich kann ich den Thread pausieren. Vielleicht sowas wie "Wait in java".
Keine AhnungWie würdest du etwas 1 mal pro Sekunde ausführen?
Keine Ahnunges soll doch nur 30 x in der sec geschrieben werden
wie schnell ist eine endlos schleife?
Du brauchst eine Frequenz von 30 Hertz. Deine CPU ist um einiges Schneller also was ist die Lösung etwas waten zwischen den Aktionen.Also einen Thread kann ich erstellen, dass ist kein Problem. Aber warum pausieren?
Ich soll doch etwas pro Sekunde aufrufen und nicht pausieren?
Hi, ich soll 30x die Sekunde eine Methode aufrufen, das soll ich in der run-Methode eines Threads realisieren, aber wie macht man sowas?
wie schnell ist eine endlos schleife?
Ich bin mir nicht sicher, ob das gut oder schlecht ist ,...Mein Heim-PC schafft eine Endlosschleife in 7 Minuten.
Die Frage war zum Nachdenken an den TE gedacht. Wenn er jetzt einfach eine Schleife schreibet wie schnell die fertig sein wird.wie schnell ist eine endlos schleife?
genau das solltest du dir überlegen! Und einige Anregungen hast du bereits bekommen.Hmm, das Problem ist, wir haben die Klasse Timer nicht kennengelernt, deshalb bin ich mir relativ unsicher, ob wir das benutzen dürfen.
Also bin mir eher sicher, dass wir Timer nicht benutzen dürfen, obwohl ich die Klasse kenen. Wie soll ich dann das ohne einen Timer hinebkommen? (wir dürfen aber sleep von threads nutzen)
da hast du doch etwasaber sleep von threads nutzen)
Ich bin mir nicht sicher, ob das gut oder schlecht ist ,...
Die Endlosschleife, die den Stack mit Aufrufen füllt, läuft bei mir nicht so lange. Ist mein Rechner schneller?
Ich probier das seit gefühlt 2 Std hahahaha. Was überlegt, einen Haufen sogar. Was gebracht -->eher wenigergenau das solltest du dir überlegen! Und einige Anregungen hast du bereits bekommen.
Hast du schon was ausprobiert? Wenn ja: was? Wenn nein: wann willst du endlich anfangen?
Naja sleep pausiert ja nur meinen Thread. Wenn ich wüsste, wie oft mein Thread pro Sekunde eine Methode aufruft, könnte ich das vielleicht irgendwie machen oder?Erkläre uns oder dir selber was der Befehl Thread.sleep( xx );
macht dann solltest du selber darauf kommen.
Du sagst Thread erstellen kannst du.Hi, ich soll 30x die Sekunde eine Methode aufrufen, das soll ich in der run-Methode eines Threads realisieren, aber wie macht man sowas?
Ich gebe dir ein Beispiel, wenn ich nun z. B. sleep mit 100 mache, so schläft die Methode halt für eine Sekunde, mehr aber auch nicht.Du sagst Thread erstellen kannst du.
Was brauchst du noch ? Es soll mindestens 30 x durchlaufen. Was könnte das sein
In welcher Maßeinheit gibst du die Wartezeit an?
Da sind Sachen die du dir selber beantworten kannst.
Wenn du noch nicht mal einen Anfang „Code“ liefen kannst wird hier keiner mehr helfen.
for(int i = 0; i < 30; i++) {
// Tue etwas
Thread.sleep(1000 / 30);
}
korrekt, aber:Du wartest doch genau 33 Millisekunden. Ist ein Tackt von ca 30 Hertz.
Ja, kannst du, das entspricht 33 Millisekunden, also genau die Zeitspanne, die mindestens gewartet werden soll.Kann ich da einfach dann 1000/30 machen?
bis die for zuende ist. wenn dann nichts mehr kommt.Und wie lange läuft überhaupt der Thread?
Bis zur letzten sich nicht wiederholenden Programmanweisung.Und wie lange läuft überhaupt der Thread?
a) jetzt wurde dem TE wieder die Lösung gegeben ... Lerneffekt also vermutlich gleich 0 und ihr könnt ihm dann die direkt die nächste Aufgabe lösen ...
Das ist ja eigentlich in jedem seiner Threads so. Das ist halt, was etwas auffällt. Und das ist schade. Denn man kann sich alles selbst erarbeiten.Ja, manchmal denkt man, dass man damit hilft aber hier ist dem wohl nicht so![]()
Die Vorgabe muss man erst einmal genau sehen: Es geht um die 10 Kästen in 1 Stunde. Es geht nicht um alle 6 Minuten ein Kasten. Das geht, aber das muss nicht sein.Das kann man sich ja doch bildlich vorstellen. Du sollst in einer bestimmten Zeit x Bierkästen stapeln. Also sagen wir mal in 1 Stunde 10 Kästen irgendwo stapeln. Nicht mehr …
Was machst du? Wie gehst du vor?
Danke, aber man glaubt mir nicht, aber ich persönlich habe als erstes an das gedacht, was er da geschrieben hat, akls mir jemand gesagt hat, das gehe auch mit sleep, aber kann das irgendwie nicht fassen, dass das die Lösung ist. Warum:Das ist ja eigentlich in jedem seiner Threads so. Das ist halt, was etwas auffällt. Und das ist schade. Denn man kann sich alles selbst erarbeiten.
Das war ja ein Versuch mit dem bildlichen Ansatz von mir, der irgendwie komplett ignoriert wurde.
Die Vorgabe muss man erst einmal genau sehen: Es geht um die 10 Kästen in 1 Stunde. Es geht nicht um alle 6 Minuten ein Kasten. Das geht, aber das muss nicht sein.
Wie macht man das? Da schaue ich auf die Uhr: Wie spät ist es?
Dann stapel ich die 10 Kästen.
Dann schaue ich wieder auf die Uhr: Dann sehe ich, wie lange ich "chillen" kann. Das trage ich mir dann als Timer im Handy ein und chille ....
==> Lösung fertig.
Aber wenn ich zu der Lösung komme: Ich stapel einen Kasten und dann chille ich 6 Minuten, dann habe ich ein Problem. Ich bin halt lahm und brauche zum Stapeln einer Kiste 1 Minute ...
==> Problem der vorgestellten Lösung.
Und man kann auch noch sehen: Wenn ich das ganz lange mache, dann verschlimmert sich das mit jedem Durchgang!
Und das ist doch sowas von bildlich. Das sollte man sich doch vorstellen können. Und auch das Vorgehen sollte man nachvollziehen können. Und das ganz ohne zu programmieren. Den Algorithmus muss man dann noch in Java schreiben. Aber das wird ganz einfach, denn ich habe die genaue Vorstellung des Algorithmus erarbeitet.
Und mit dem auf die Uhr schauen wird jede Abweichung auch wieder korrigiert. Wenn ich bei einem Durchgang etwas zu langsam war, dann habe ich aber die Ursprüngliche Anfangszeit und kann da ja immer den genauen Soll-Zeitpunkt nehmen. Also wenn es zum "chillen" kommt, gehe ich jedes mal auf die genau berechnete Endezeit. Ein Fehler von vorherigen Durchläufen wird also immer korrigiert.
while(true){
//Hier was ich mache
sleep(1000/30)
}
Achso okay, ja dann müsste es passen.Darauf kann es dir hier nicht ankommen.
Du müsstest in der Methode ein Mircobenchmark durchführen. Und das in Java nicht möglich.
Die Lösung verlangt nur das: 1000/30
Also zwei System.currenTimeMillisEin Microbenchmark ist nicht notwendig. So könnte man mit System.currentTimeMillis arbeiten um möglichst nah ran zu kommen.
Und wenn die gleichmäßige Verteilung nicht notwendig ist, wird der Overhead auch nicht groß.
Genau 30 mal pro Sekunde ist zwar nicht möglich. Aber eine annähernd konstante Schleife zu erstellen schon.Darauf kann es dir hier nicht ankommen.
Du müsstest in der Methode ein Mircobenchmark durchführen. Und das in Java nicht möglich.
Der TE hat recht damit wenn, er die verstrichene Zeit misst und den Sleep entsprechend adaptiert.Was ist nun das Problem an dieser Lösung, bei dem Teil, wo ich etwas tue, das hat mich ja auch Sekunden gekostet.
Das heißt, ich müsste die Zeit die ich hier:
Methode {
hier tue ich etwas //hier
... //hier
sleep(1000/30)
}
"verschwendet" habe, abziehen.