我怎样才能杀死一个线程? 不使用stop();

Thread currentThread=Thread.currentThread(); public void run() { while(!shutdown) { try { System.out.println(currentThread.isAlive()); Thread.interrupted(); System.out.println(currentThread.isAlive()); if(currentThread.isAlive()==false) { shutdown=true; } } catch(Exception e) { currentThread.interrupt(); } } } }); thread.start(); 

停止调用的另一种方法是使用中断向线程发出信号,表示您希望完成正在执行的任务。 (假设你想要停止的线程行为良好,如果在抛出之后立即吃掉InterruptedExceptions并且不检查被中断的状态,那么你又回到了使用stop()的状态。

下面是我写的一些代码作为线程问题的答案,这是一个线程中断如何工作的例子:

 public class HelloWorld { public static void main(String[] args) throws Exception { Thread thread = new Thread(new Runnable() { public void run() { try { while (!Thread.currentThread().isInterrupted()) { Thread.sleep(5000); System.out.println("Hello World!"); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }); thread.start(); System.out.println("press enter to quit"); System.in.read(); thread.interrupt(); } } 

有些事情要注意:

  • 中断导致sleep()wait()立即抛出,否则你坚持等待睡眠时间通过。

  • 请注意,不需要单独的布尔标志。

  • 正在停止的线程通过检查中断状态并捕获While循环之外的InterruptedExceptions(使用它来退出循环)进行协作。 中断是一个可以使用exception进行stream量控制的地方,也就是整个stream程。

  • 在catch块中的当前线程上设置中断在技术上是最好的,但对于这个例子来说是过度的,因为没有别的东西需要设置中断标志。

关于发布代码的一些观察:

  • 发布的示例是不完整的,但是将实例variables中的当前线程引用似乎是个不好的主意。 它将被初始化为任何正在创build对象的线程,而不是执行run方法的线程。 如果同一个Runnable实例在多个线程上执行,那么实例variables大部分时间都不会反映正确的线程。

  • 检查线程是否处于活动状态必然总是会导致为true(除非currentThread实例variables引用了错误的线程时出现错误),只有在线程执行完毕后, Thread#isAlive为false,只是因为被中断而返回false。

  • 调用Thread#interrupted将导致清除中断标志,在这里没有意义,特别是因为返回值被丢弃。 调用Thread#interrupted是testing中断标志的状态,然后清除它,这是抛出InterruptedException的事情使用的便捷方法。

通常,一个线程被中断时被终止。 那么,为什么不使用本地布尔 ? 尝试isInterrupted() :

  Thread t = new Thread(new Runnable(){ @Override public void run() { while(!Thread.currentThread().isInterrupted()){ // do stuff } }}); t.start(); // Sleep a second, and then interrupt try { Thread.sleep(1000); } catch (InterruptedException e) {} t.interrupt(); 

好的方法是使用布尔标志来表示线程。

 class MyRunnable implements Runnable { public volatile boolean stopThread = false; public void run() { while(!stopThread) { // Thread code here } } } 

创build一个名为myrunnable的MyRunnable实例,将其包装在一个新的Thread实例中并启动该实例。 当你想标记线程停止时,设置myrunnable.stopThread = true。 这样,它就不会停在某个东西的中间,而只是在我们期望它停止的地方。