2017-05-19 5 views
10

Mam usługę executora, do którego przesyłam wiele wątków do wykonania jakiejś pracy, teraz chcę anulować/przerwać wykonywanie niektórych wątków, niech ja wiem, jak mogę to zrobić?Jak uzyskać wątek zgłoszony do usługi executer i przerwać ją w Javie

Na przykład: - Poniżej znajduje się moja klasa Thread, która drukuje nazwę nici po pewnym czasie bez końca.

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

teraz będę tworzyć wiele wątków, nadając im nazwy, tak że później mogę przerwać tego konkretnego wątku i zatrzymać jej wykonanie.

Teraz w mojej klasie test tworzę 4 wątki i chcą zatrzymać realizację 2 wątków nazwanych Amit i 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". 
} 
} 

Daj mi znać, jak mogę to zrobić?

+2

Podpowiedź: 'executorService.submit' zwraca wartość' Przyszłość '. –

+0

@AndyTurner, wiem, że daje "Przyszłość", ale czy możesz mi powiedzieć, w jaki sposób mogę użyć go w moim przypadku, aby pobrać wątki o nazwie 'amit' i przerwać jego wykonanie? –

+0

Twój 'MyThread' nie musi przedłużać' Thread'. Wystarczy zaimplementować 'Runnable'. –

Odpowiedz

10

Twoje rzeczywiste numery nie są uruchamiane w wątkach o tych nazwach. Nie są uruchamiane bezpośrednio jako wątki, są uruchamiane na wątkach ExecutorService.

Musisz więc zachować mapowanie nazwy na Future, a następnie anulować przyszłość, kiedy chcesz.

Map<String, Future<?>> map = new HashMap<>(); 
map.put("amit", executorService.submit(amit)); 
map.put("k", executorService.submit(k)); 
// ... etc 

Następnie, aby anulować amit:

map.get("amit").cancel(true); 

Oczywiście, można po prostu być przechowywane zmienne jawne:

Future<?> amitFuture = executorService.submit(amit); 
amitFuture.cancel(true); 

ale może to być niewygodne, jeśli masz dużo zmiennych .

+0

Czy jest również możliwe podanie nazwy wątku, aby ułatwić rejestrowanie i debugowanie? –

Powiązane problemy