5

我一直在寻找杀死线程的方法,看来这是最流行的方法

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),那么我们如何回调 - 特别是考虑到此方法可能已被调用多次,因此我们有很多线程而(运行)然后为一个更改标志会为每个人更改它吗?

谢谢

4

2 回答 2

2

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

此外,实际上调用Threadsinterrupt()方法通常是一种更好的方法,因为这样它将摆脱抛出的阻塞动作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();
  }
}
于 2013-04-05T15:08:18.127 回答
0

我添加了一个实用程序类,它本质上具有静态地图和方法。

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

我也将我的循环逻辑从 while true 更改为 while!被中断。这种方法可以吗还是这种糟糕的编程风格/约定

谢谢

于 2013-04-06T19:13:07.830 回答