Hi,
ich probiere mich gerade etwas an Multithreading, aber so ganz scheine ich es noch nicht verstanden zu haben.
Mein Ziel ist es, einen Task, der eine (oder mehrere) Aufgaben erfüllt, zu pausieren und bei Bedarf wieder die Arbeit fortzuführen.
Das heißt er zählt einen long-Wert hoch (mein gewünschtes Ergebnis):
1,2,3,4,5,6,7,8 pausiert, wartet 50ms, arbeitet weiter: 9,10,11,12,13,14,15,16, pausiert...
Meine Idee war es, wait() und notify() zu benutzen. Doch das Aufwecken funktioniert nicht.
Zum Testen verwende ich ein minimalistisches Beispiel, bei dem eine Zähler hochgezählt wird und bei mod 8 gestoppt wird. Nach 50ms soll die Arbeit wieder aufgenommen werden.
Problem: Der Task wird nicht aufgweckt.
Mein bisheriger Code:
Meine erste Überlegung war, dass ein Thread/Service sich nicht selbst wecken kann, also habe ich runner.resume() durch new MyServce().resume() ersetzt, aber ohne Erfolg.
Eigentlich habe ich erwartet, dass der Task im Hintergrund weiterläuft (obwohl er pausiert wurde), aber den Output für den User erst erkennbar macht, wenn er wieder weiterläuft.
Also:
1,2,3,4,5,6,7,8 pausiert, wartet 50ms, arbeitet weiter: 9,10,11,12,13,14,15,16, 17,18, 19, 20, 21, 22, 23, 24 .... (er hat weiter gearbeitet) pausiert...
Und da hört es auf. Ich bin mir sicher, wenn ich ihn wecken könnte, würde mein erwartetes Ergebnis rauskommen (das ich dann noch lösen müsste um mein gewünschtes Ergebnis zu bekommen).
Kann mir jemand helfen? Wisst ihr was ich meine? Falls nicht, erkläre ich es gerne nochmal.
ich probiere mich gerade etwas an Multithreading, aber so ganz scheine ich es noch nicht verstanden zu haben.
Mein Ziel ist es, einen Task, der eine (oder mehrere) Aufgaben erfüllt, zu pausieren und bei Bedarf wieder die Arbeit fortzuführen.
Das heißt er zählt einen long-Wert hoch (mein gewünschtes Ergebnis):
1,2,3,4,5,6,7,8 pausiert, wartet 50ms, arbeitet weiter: 9,10,11,12,13,14,15,16, pausiert...
Meine Idee war es, wait() und notify() zu benutzen. Doch das Aufwecken funktioniert nicht.
Zum Testen verwende ich ein minimalistisches Beispiel, bei dem eine Zähler hochgezählt wird und bei mod 8 gestoppt wird. Nach 50ms soll die Arbeit wieder aufgenommen werden.
Problem: Der Task wird nicht aufgweckt.
Mein bisheriger Code:
Code:
public class ConcurrenTest {
public static void main(String[] args) {
MyService runner = new MyService();
runner.start();
try {
Thread.sleep(50);
runner.resume();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyService extends Service<Void> {
private boolean paused;
@Override
protected Task<Void> createTask() {
int limit = 20;
int current = 0;
while (current < limit) {
if (paused) waitWhilePaused();
System.out.println(current);
if ((current > 0) && (current % 8) == 0) {
pause();
}
current++;
}
return null;
}
synchronized void pause() {
paused = true;
}
synchronized void waitWhilePaused() {
while (paused) {
try {
System.out.println("Ich warte ...");
wait();
System.out.println("Ich warte jetzt nicht mehr");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void resume() {
System.out.println("Resume");
paused = false;
notifyAll();
}
}
Meine erste Überlegung war, dass ein Thread/Service sich nicht selbst wecken kann, also habe ich runner.resume() durch new MyServce().resume() ersetzt, aber ohne Erfolg.
Eigentlich habe ich erwartet, dass der Task im Hintergrund weiterläuft (obwohl er pausiert wurde), aber den Output für den User erst erkennbar macht, wenn er wieder weiterläuft.
Also:
1,2,3,4,5,6,7,8 pausiert, wartet 50ms, arbeitet weiter: 9,10,11,12,13,14,15,16, 17,18, 19, 20, 21, 22, 23, 24 .... (er hat weiter gearbeitet) pausiert...
Code:
Mein momentanes Ergebnis ist:
0
1
2
3
4
5
6
7
8
Ich warte ...
Und da hört es auf. Ich bin mir sicher, wenn ich ihn wecken könnte, würde mein erwartetes Ergebnis rauskommen (das ich dann noch lösen müsste um mein gewünschtes Ergebnis zu bekommen).
Kann mir jemand helfen? Wisst ihr was ich meine? Falls nicht, erkläre ich es gerne nochmal.