Как получить поток, отправленный службе executer, и прервать его в Java

У меня есть служба-исполнитель, которому я представляю несколько потоков для выполнения некоторой работы, теперь я хочу отменить/прервать выполнение некоторых потоков, сообщите мне, как я могу это сделать?

Например: - Ниже мой класс Thread, который печатает имя потока через некоторый интервал бесконечно.

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

Теперь я создам несколько потоков, указав им имя, чтобы позже я мог прервать этот конкретный поток и остановить его выполнение.

Теперь в моем классе Test я создаю 4 потока и хочу остановить выполнение двух потоков с именем amit и 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 фактически не запускается в потоках с этими именами. Они не запускаются напрямую как потоки, они запускаются в потоках 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);

но это может быть громоздким, если у вас много переменных.