杀死线程的替代方法

时间:2013-04-05 14:46:47

标签: java multithreading concurrency

我一直在寻找杀死线程的方法,看起来这是最受欢迎的方法

public class UsingFlagToShutdownThread extends Thread {
  private boolean running = true;
  public void run() {
    while (running) {
      System.out.print(".");
      System.out.flush();
      try {
        Thread.sleep(1000);
      } catch (InterruptedException ex) {}
    }
    System.out.println("Shutting down thread");
  }
  public void shutdown() {
    running = false;
  }
  public static void main(String[] args)
      throws InterruptedException {
    UsingFlagToShutdownThread t = new UsingFlagToShutdownThread();
    t.start();
    Thread.sleep(5000);
    t.shutdown();
  }
}

但是,如果在while循环中我们生成了另一个被数据填充的对象(比如一个运行和更新的gui),那么我们如何回调 - 特别是考虑到这个方法可能已被多次调用,所以我们有许多线程与while(运行)然后更改一个标志会为每个人改变它吗?

感谢

2 个答案:

答案 0 :(得分:2)

解决这些问题的一种方法是使用Monitor类来处理所有线程。它可以启动所有必需的线程(可能在不同的时间/必要时),一旦你想关闭,你可以调用一个中断所有(或一些)线程的shutdown方法。

另外,实际调用Thread interrupt()方法通常是一种更好的方法,因为它会阻止抛出InterruptedException的行为(例如等待/休眠)。然后它将在Threads中设置一个标志(可以使用isInterrupted()进行检查,或者使用interrupted()进行检查和清除。例如,以下代码可以替换您当前的代码:

public class UsingFlagToShutdownThread extends Thread {
  public void run() {
    while (!isInterrupted()) {
      System.out.print(".");
      System.out.flush();
      try {
        Thread.sleep(1000);
      } catch (InterruptedException ex) { interrupt(); }
    }
    System.out.println("Shutting down thread");
  }
  public static void main(String[] args)
      throws InterruptedException {
    UsingFlagToShutdownThread t = new UsingFlagToShutdownThread();
    t.start();
    Thread.sleep(5000);
    t.interrupt();
  }
}

答案 1 :(得分:0)

我添加了一个基本上有静态地图和方法的utlility类。

地图的类型为Long id, Thread thread。我添加了两个方法,一个添加到地图,另一个通过使用中断来停止线程。此方法将id作为参数。

我也改变了我的循环逻辑,同时也是如此! isInterrupted。这种方法是正确的还是这种糟糕的编程风格/惯例

感谢