Piszę aplikację, która spawnuje wiele równoczesnych zadań. Używam puli wątków, aby to zaimplementować.jak zatrzymać wątek w wątku Pula
Może się zdarzyć, że wystąpi zdarzenie, które powoduje, że obliczenia wykonywane w zadaniach są nieprawidłowe. W takim przypadku chciałbym zatrzymać aktualnie uruchomione zadania i rozpocząć nowe.
Mój problem: Jak zatrzymać aktualnie wykonywane zadania? Rozwiązaniem, które zaimplementowałem, jest przechowywanie odniesienia do wątku zadania i wywołanie interrupt()
w tym wątku. W kodzie demo:
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;
}
}
a głównym sposobem jest:
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();
}
}
Czy jest to dobre rozwiązanie, czy jest jakiś lepszy sposób, aby zatrzymać uruchomiony wątek w puli wątków?
Wyciągnij wtyczkę;) – sje397