Thread / Prozess stoppen?

beta20

Top Contributor
Hallo zusammen,

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();
}

Danke für jede Hilfe
 

Robat

Top Contributor

Robat

Top Contributor
Geht bestimmt auch noch schöner .. :)
Java:
public class StoppableThread {
    private Thread worker;
    private Consumer<StoppableThread> task;

    public StoppableThread(Consumer<StoppableThread> task) {
        this.task = task;
    }

    public void start() {
        worker = new Thread(() -> task.accept(this));
        worker.start();
    }

    public void stop() {
        worker = null;
    }


    public static void main(String[] args)  {
        StoppableThread t = new StoppableThread(task -> {
            for(int i = 0; i < 5; i++) {
                System.out.println("Hallo Welt die " + (i+1)+".");
                sleep(1000);
            }
            task.stop();
        });
        t.start();

        sleep(5000);
        t.stop();
    }

    static void sleep(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            return;
        }
    }
}
 

Robat

Top Contributor
danke dir - aber wo ist nun das angesprochene Flag?
Berechtigte Frage. Hab dir die falsche Klasse geschickt:p Sorry
Java:
public class StoppableThread {
    private Thread worker;
    private Consumer<StoppableThread> task;
    private boolean running;

    public StoppableThread(Consumer<StoppableThread> task) {
        this.task = task;
        this.running = false;
    }

    public void start() {
        this.running = true;
        worker = new Thread(() -> task.accept(this));
        worker.start();
    }

    public void stop() {
        running = false;
        worker = null;
    }

    public boolean isRunning() {
        return running;
    }

    public static void main(String[] args)  {
        StoppableThread t = new StoppableThread(task -> {
            int i = 0;
            while(task.isRunning()) {
                System.out.println("Hallo Welt die " + (i++ +1)+".");
                sleep(1000);
            }
        });
        t.start();
        sleep(5000);
        t.stop();
    }

    static void sleep(long ms) {
        try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            return;
        }
    }
}
 

beta20

Top Contributor
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)

Code:
    @Resource
    private ManagedExecutorService mes;

    private List<Future<?>> tasks;

    @Resource
    private ManagedScheduledExecutorService scheduledExecutorService;

private boolean currentlyRunning = false;

@Timeout
    @AccessTimeout(value = 20, unit = TimeUnit.MINUTES)
    @Schedule(minute = "*/1", hour = "*", persistent = false)
    public void execute() throws Exception {

        LOGGER.info("START SCHEDULER");

        try {
            if (currentlyRunning) {
                LOGGER.warn("Scheduler is currently running...");
                return;
            }

            currentlyRunning = true;

            /**
             * Alle noch nicht ausgeführten Schedules bekommen
             */
            List<ScheduleExecution> scheduleExecutionList = scheduleExecutionService
                    .findAllScheduleExecutionOutstanding();

            if (scheduleExecutionList == null || scheduleExecutionList.size() == 0) {
                LOGGER.info("NO PLANNED SCHEDULES FOUND");
                currentlyRunning = false;
                return;
            }

            LOGGER.info("FOUND SCHEDULES: " + scheduleExecutionList.size());

            tasks = new ArrayList<>();
            
            for (ScheduleExecution scheduleExecution : scheduleExecutionList) {

                synchronized (this) {

                    tasks.add(mes.submit(() -> {
                        try {
                            executeAction(scheduleExecution);
                        }
                        catch(Exception e){
                        }
                    }));
                }
            }

            currentlyRunning = false;
        }

        catch (Exception e) {
            LOGGER.error(ExceptionUtils.getFullStackTrace(e));
            currentlyRunning = false;
        }

        LOGGER.info("END SCHEDULER");
    }

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

Danke für jede Hilfe
 
X

Xyz1

Gast
Ein Prozess ist in Java beendet, wenn er tot ist, dh alle Anweisungen fertig sind.

Ein vorzeitiges Ende kannst Du nur durch eine volatile-Variable erreichen.

Lies dich mal in volatile und Threads ein.
 

mrBrown

Super-Moderator
Mitarbeiter
Aktuell übergibst du eine anonyme Lambda-Funktion als Task - die hat keine ID, an die du kommen könntest.

Erstell stattdessen eine eigene Klasse mit passendem Interface, der kannst du dann eine ID und Möglichkeiten zum abbrechen spendieren.
 

beta20

Top Contributor
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) ?
 

mrBrown

Super-Moderator
Mitarbeiter
Ok, also sowas wie die StoppableThread von @@Robat ?
Ja, so in der Art - musst das halt an deine Erfordernisse anpassen.

Aber wie übergebe ich diese dann?
So wie jetzt auch. Musst nur die execute-Funktion entsprechend anpassen, die hat ja bisher niemand gesehen.

synchronized (this) passt so?
Keine Ahnung - wozu ist denn die Task-Liste da?

Mache ich dann sowas in der Art:
tasks.add(myStoppableThreadObject) ?
Du solltest das schon an den ExecutorService übergeben, sonst passiert nicht viel...
 

beta20

Top Contributor
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...
Die Taskliste speichert alle ausstehenden Tasks (Prozesse). Weiß nicht, ob das wirklich gebraucht wird?

Du solltest das schon an den ExecutorService übergeben, sonst passiert nicht viel...
Wie genau soll das aussehen?
 

mihe7

Top Contributor
Die Taskliste speichert alle ausstehenden Tasks (Prozesse). Weiß nicht, ob das wirklich gebraucht wird?
Ü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.

Wie genau soll das aussehen?
Wie in Deinem jetzigen Code auch: mes.submit(...)
 

beta20

Top Contributor
Ü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?

Wie in Deinem jetzigen Code auch: mes.submit(...)
OK, aber welches Objekt übergebe ich dann? Das von "StoppableThread" ?
 
X

Xyz1

Gast
Wie wär s denn damit:
Java:
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Threads {
	private int i = 0;
	private ArrayList<Runnable> l = new ArrayList<Runnable>();
	private ArrayList<Future<?>> m = new ArrayList<>();
	private ExecutorService es = Executors.newFixedThreadPool(4);

	int addRunnableGetIndex(Runnable r) {
		m.add(es.submit(r));
		l.add(r);
		i++;
		return i;
	}

	boolean stopRunnable(int index) {
		return m.get(index).cancel(true);
	}

	public static void main(String[] args) {
		Threads t = new Threads();
		t.addRunnableGetIndex(() -> {
			try {
				Thread.sleep(5000);
				System.out.println("Hello " + 5000);
			} catch (InterruptedException e) {
				System.out.println(e);
			}
		});
		t.addRunnableGetIndex(() -> {
			try {
				Thread.sleep(4000);
				System.out.println("Hello " + 4000);
			} catch (InterruptedException e) {
				System.out.println(e);
			}
		});
		t.addRunnableGetIndex(() -> {
			try {
				Thread.sleep(3000);
				System.out.println("Hello " + 3000);
			} catch (InterruptedException e) {
				System.out.println(e);
			}
		});
		t.addRunnableGetIndex(() -> {
			try {
				Thread.sleep(10000);
				System.out.println("Hello " + 10000);
			} catch (InterruptedException e) {
				System.out.println(e);
			}
		});
		System.out.println(t.stopRunnable(1));
		System.out.println(t.stopRunnable(3));
	}
}


Code:
true
true
java.lang.InterruptedException: sleep interrupted
Hello 3000
Hello 5000

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....)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6
L Compiler-Fehler Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 2
F Exception in thread main java.lang.StackOverflowError Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben