Ausgabe
Ich habe einen Executor-Dienst und möchte die Ausführung einiger Threads abbrechen/unterbrechen.
Zum Beispiel: Unten ist meine Thread-Klasse, die den Thread-Namen nach einem bestimmten Intervall endlos ausgibt.
public class MyThread implements Runnable {
String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
try {
System.out.println("Thread "+ name + " is running");
sleep(500);
}catch (InterruptedException e){
System.out.println("got the interrupted signal");
}
}
}
Jetzt erstelle ich mehrere Threads, indem ich ihnen Namen gebe, damit ich später einen bestimmten Thread mit seinem Namen stoppen kann.
Wie unten gezeigt, erstelle ich 4 Threads und möchte die Ausführung von 2 Threads mit den Namen foo und bar stoppen .
public class ThreadTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
MyThread amit = new MyThread("foo");
MyThread k = new MyThread("bar");
MyThread blr = new MyThread("tel-aviv");
MyThread india = new MyThread("israel");
executorService.submit(foo);
executorService.submit(bar);
executorService.submit(tel-aviv);
executorService.submit(israel);
}
}
Lösung
Ihre MyThread
s werden nicht wirklich auf Threads mit diesen Namen ausgeführt. Sie werden nicht direkt als Threads ausgeführt, sondern auf den ExecutorService
Threads von .
Sie müssen also eine Zuordnung von name zu Future
beibehalten und dann die Zukunft stornieren, wenn Sie möchten.
Map<String, Future<?>> map = new HashMap<>();
map.put("amit", executorService.submit(amit));
map.put("k", executorService.submit(k));
// ... etc
Dann zum Stornieren amit
:
map.get("amit").cancel(true);
Natürlich hätte man auch einfach explizite Variablen behalten können:
Future<?> amitFuture = executorService.submit(amit);
amitFuture.cancel(true);
Dies kann jedoch unhandlich sein, wenn Sie viele Variablen haben.
Beantwortet von – Andy Turner
Antwort geprüft von – Senaida (FixError Volunteer)