Ich schreibe eine Anwendung, die mehrere gleichzeitige Aufgaben hervorbringt. Ich verwende einen Thread-Pool, um das zu implementieren.Wie man einen Thread in einem Threadpool stoppt
Es kann vorkommen, dass ein Ereignis auftritt, macht die Berechnungen ungültig in den Aufgaben erledigt werden. In diesem Fall möchte ich die laufenden Aufgaben stoppen und neue starten.
Mein Problem: Wie stoppe ich die laufenden Aufgaben? Die von mir implementierte Lösung besteht darin, einen Verweis auf den Task-Thread zu speichern und interrupt()
für diesen Thread aufzurufen. Im Demo-Code:
public class Task implements Runnable {
private String name;
private Thread runThread;
public Task(String name) {
super();
this.name = name;
}
@Override
public void run() {
runThread = Thread.currentThread();
System.out.println("Starting thread " + name);
while (true) {
try {
Thread.sleep(4000);
System.out.println("Hello from thread " + name);
} catch (InterruptedException e) {
// We've been interrupted: no more messages.
return;
}
}
}
public void stop() {
runThread.interrupt();
}
public String getName() {
return name;
}
}
Und die wichtigste Methode ist:
public static void main(String args[]) {
executorService = Executors.newFixedThreadPool(2);
Task t1 = new Task("Task1");
Task t2 = new Task("Task2");
executorService.execute(t1);
executorService.execute(t2);
executorService.execute(new Task("Task3"));
executorService.execute(new Task("Task4"));
try {
Thread.sleep(12000);
t1.stop();
System.err.println("Stopped thread " + t1.getName());
Thread.sleep(8000);
t2.stop();
System.err.println("Stopped thread " + t2.getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Ist dies eine gute Lösung, oder gibt es einen besseren Weg, um einen laufenden Thread in einem Thread-Pool zu stoppen?
Ziehen Sie den Stecker;) – sje397