Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich möchte innerhalb einer Schleife mehrere Threads / Prozesse starten. (soweit OK).
Ebenfalls möchte ich aber auch die Möglichkeit haben Thread / Prozesse wieder zu beenden.
Generell meine Fragen:
- Hat ein Thread / Prozess eine ID, die ich in einem Objekt einer eigenen Klasse speichern kann? Wenn ja, wie bekomme ich diese?
- Wie kann ich den Thread wieder stoppen?
Mir schweb sowas vor:
Java:
public void stopThread(String uuid) {
// stop thread();
}
Jeder Thread sollte eine Abbruchbedingung haben - also ein Flag - welches du auf true/false setzen kannst um den Thread zu stoppen. Es gibt zwar eine Thread#interrupt() Methode allerdings sagt diese Methode nur, dass der Thread jetzt - irgendwann - gestoppt werden wird.
Es gibt halt - wie gesagt - dieses interrupted-Flag welches durch die interrupt() Methode gesetzt wird. Aber nur weil dieses Flag auf true ist heißt es noch lange nicht, dass dein Thread wirklich direkt beendet wird.
danke - aber ich weiß gerade nicht so 100% ob das das ist, was ich brauche... vllt sollte ich ein bisschen mehr ausholen, was ich brauche:
1) Ich habe einen @EJB - Container mit einem Schedule, der jede Minute läuft (ich nutze WildFly als APP - Server)
2) Zunächst prüfe ich, ob es ausstehende Aktionen gibt (ScheduleExecution) in der Datenbank gibt.
3) Wenn ja, sollen diese abgearbeitet werden (passiert dann in der for - Schleife)
4) executeAction -> ist dann die Methode in der irgendeine Aktion passiert (könnte man durch sleep() ersetzen)
Das Problem sehe ich nun in der Methode ab: synchronized.
- Wie bekomme ich / erstelle ich hier einen Task, womit ich dann auch die ID bekomme.
- Die ID brauche ich dann später um einen Task zu stoppen - auch unter der Berücksichtigung von @Robat
Ok, also sowas wie die StoppableThread von @Robat ?
Aber wie übergebe ich diese dann?
synchronized (this) passt so?
Mache ich dann sowas in der Art:
tasks.add(myStoppableThreadObject) ?
Ja, so in der Art - musst das halt an deine Erfordernisse anpassen.
Keine Ahnung - wozu ist denn die Task-Liste da?
Du solltest das schon an den ExecutorService übergeben, sonst passiert nicht viel...
Über die Taskliste kannst Du über eine Art "ID" (= Index der Liste) auf die Futures zugreifen. Allerdings bringt es natürlich nichts, wenn Du lokal eine neue Liste erstellst, die Futurs dort einfügst, um dann nichts mit der Liste anzustellen. Auch brauchst Du dann keinen synchronisierten Zugriff auf die Liste.
Über die Taskliste kannst Du über eine Art "ID" (= Index der Liste) auf die Futures zugreifen. Allerdings bringt es natürlich nichts, wenn Du lokal eine neue Liste erstellst, die Futurs dort einfügst, um dann nichts mit der Liste anzustellen. Auch brauchst Du dann keinen synchronisierten Zugriff auf die Liste.
naja ich will aber von meiner WebGUI die Prozesse auch killen können.
Was ich mir vorstellen könnte ist, dass ich die ProcessID + den Host in dem "ScheduleExecution" - Objekt speichere.
In der WebGUI zeige ich ja alle ScheduleExecutions an. Hier sollte es dann ebenfalls einen Button geben: " Schedule abbrechen".
Dann wird wird auf diesem Host der Prozess mit diese ID abgebrochen? Oder wie könnte man das lösen?
What is happening?
4 threads are queued, 3 are already started, the 4th is not yet started, 2 are stopped (true true), one of them is interrupted, two give out after 3 and 5 seconds. (sorry, heute ist friday, eh ich mein Freitag....)