title: how to stop a thread in a threadpool
body: <p>I'm writing an application that spawns multiple concurrent tasks. I'm using a thread pool to implement that. </p>
  
  <p>It may happen that an event occurs that renders the computations being done in the tasks invalid. In that case, I would like to stop the currently running tasks, and start new ones. </p>
  
  <p>My problem: How do I stop the currently running tasks? The solution I implemented is to store a reference to the task thread and call <code>interrupt()</code> on this thread. In demo code:</p>
  
  <pre><code>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;
      }
  }
  </code></pre>
  
  <p>And the main method is:</p>
  
  <pre><code>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();
      }
  }
  </code></pre>
  
  <p>Is this a good solution, or is there a better way to stop a running thread in a thread pool?</p>