我一直在寻找杀死线程的方法,看起来这是最受欢迎的方法
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(运行)然后更改一个标志会为每个人改变它吗?
感谢
答案 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。这种方法是正确的还是这种糟糕的编程风格/惯例
感谢