Как получить поток, отправленный в службу executer, и прервать его на Java
у меня есть служба исполнителя, которой я отправляю несколько потоков для выполнения некоторой работы, теперь я хочу отменить / прервать выполнение некоторых потоков, дайте мне знать, как я могу это сделать ?
например: - ниже мой класс потока, который печатает имя потока после некоторого интервала бесконечно.
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");
e.printStackTrace();
}
}
}
теперь я создам несколько потоков, дав им имя, чтобы позже я мог прервать этот конкретный поток и остановить его исполнение.
теперь в моем тестовом классе я создаю 4 потока и хочу остановить выполнение 2 потоков с именем Амит и k.
public class ThreadTest {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
MyThread amit = new MyThread("amit");
MyThread k = new MyThread("k");
MyThread blr = new MyThread("blr");
MyThread india = new MyThread("india");
executorService.submit(amit);
executorService.submit(k);
executorService.submit(blr);
executorService.submit(india);
// now i want to stop the execution of thread Named "amit" and "k".
}
}
Дайте мне знать, как я могу это сделать ?
1 ответов
код MyThread
s фактически не запускаются в потоках с этими именами. Они не запускаются непосредственно как потоки, они запускаются на ExecutorService
С потоками.
Итак, вам нужно сохранить отображение имени на Future
, а затем отменить будущее, когда вы хотите.
Map<String, Future<?>> map = new HashMap<>();
map.put("amit", executorService.submit(amit));
map.put("k", executorService.submit(k));
// ... etc
затем отменить amit
:
map.get("amit").cancel(true);
конечно, вы могли бы просто сохранить явные переменные:
Future<?> amitFuture = executorService.submit(amit);
amitFuture.cancel(true);
но это может быть громоздким, если у вас много переменная.